2008-11-06 10 views
5

Gibt es eine effiziente Möglichkeit, eine Teilmenge eines C# -Arrays zu übernehmen und an ein anderes Stück Code zu übergeben (ohne das ursprüngliche Array zu ändern)? Ich benutze CUDA.net mit einer Funktion, die ein Array auf die GPU kopiert. Ich möchte z.B. Übergeben Sie die Funktion ein Zehntel des Arrays und kopieren Sie so jedes 10. des Arrays separat auf die GPU (für Pipelining-Zwecke).Array-Subsets effizient abrufen

Das Kopieren des Arrays auf diese Weise sollte genauso effizient sein wie das Kopieren auf einmal. Es kann mit unsicherem Code gemacht werden und nur auf den richtigen Speicherort verweisen, aber anders als ich bin mir nicht sicher. Die CopyTo-Funktion kopiert das gesamte Array in ein anderes Array, so dass dies nicht sinnvoll erscheint.

Antwort

11

Okay, ich, bevor Sie die Frage falsch verstanden hatte.

Was Sie wollen, ist System.Buffer.BlockCopy oder System.Array.Copy.

Die LINQ Wege werden schrecklich ineffizient sein. Wenn Sie den Puffer, in den Sie kopieren, wiederverwenden können, hilft dies auch bei der Effizienz und vermeidet, jedes Mal ein neues Array zu erstellen - kopieren Sie einfach über den Anfang. Sofern Sie Ihr "großes" Array nicht gleichmäßig aufteilen können, benötigen Sie für den letzten Fall ein neues Array.

3

Ich bin nicht sicher, wie effizient diese aber ...

int[] myInts = new int[100]; 

//Code to populate original arrray 

for (int i = 0; i < myInts.Length; i += 10) 
{ 
    int[] newarray = myInts.Skip(i).Take(10).ToArray(); 
    //Do stuff with new array 
} 
0

Sie Erweiterungsmethoden und yield return verwenden:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex) 
{ 
    for (var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex) 
     yield return array[currentIndex]; 
} 
+0

gut Das ist für einige Zwecke, aber das ist nicht effizient, ein Array.Copy würde viel schneller sein. –

+0

In welcher Weise ist es nicht effizient? Wenn Sie nur Teile eines Arrays iterieren möchten, ist dies effizienter als das Kopieren eines Arrays. –

+0

Sorry sollte es in der richtigen Weise erklären. Für das Iterieren mag es richtig sein, aber es gibt viele Operationen, die bei der Verwendung von 'yield' auftreten. Der Autor des Fragenautors ist, wie man eine Teilmenge eines Arrays in die GPU kopiert. Wenn man die oben beschriebene Methode benutzt, muss man 'ToArray()' aufrufen, was furchtbar ineffizient wäre. Die Methode ist nicht schlecht, aber nicht gut für diesen Zweck imho. –

1

Sie könnten Marshal.Copy versuchen, wenn Sie von einem Array von Bytes zu einem nicht verwalteten Zeiger gehen müssen. Dadurch vermeiden Sie, dass Sie unsicheren Code erstellen.

Edit: Dies würde eindeutig nur funktionieren, wenn Sie ihre API reimplementieren. Entschuldigung - missverstanden. Sie möchten eine effiziente Subarray-Methode.

Es scheint mir, dass Sie wirklich, was Sie wollen ist ein api in der ursprünglichen Klasse der Form

void CopyToGpu(byte[] source, int start, int length);