Frage

Gibt es eine effiziente Möglichkeit, eine Teilmenge von einem C # Array zu nehmen und es an einem anderen peice Code übergeben (ohne das ursprüngliche Array zu ändern)? Ich verwende CUDA.net, die eine Funktion, die ein Array Kopien an die GPU hat. Ich möchte zum Beispiel passieren der Funktion einen 10 des Arrays und kopieren somit jede 10. des Arrays an die GPU seperat (für Pipelining Zwecke).

Das Kopieren des Array auf diese Weise sollte in einem Rutsch als Kopieren es so effizient sein. Es kann mit unsicheren Code und nur Verweisen auf die richtige Speicherstelle aber anders als das getan werden, ich bin nicht sicher. Die CopyTo Funktion kopiert das gesamte Array zu einem anderen Array so ist dies nicht sinnvoll erscheinen.

War es hilfreich?

Lösung

Okay, würde ich die Frage falsch verstanden vor.

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

Die LINQ Wege werden hideously ineffizient sein. Wenn Sie den Puffer wieder zu verwenden sind in der Lage Sie kopieren in, das wird auch die Effizienz helfen, die Vermeidung eines neuen Arrays jedes Mal zu schaffen - einfach kopieren über die Spitze. Es sei denn, Sie können Ihre „große“ Array aufzuteilen gleichermaßen obwohl, müssen Sie ein neues für den letzten Fall.

Andere Tipps

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

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
}

Sie könnten Marshal.Copy versuchen, wenn Sie aus einem Array von Bytes zu einem nicht verwalteten Zeiger gehen müssen. Das vermeidet unsicheren Code selbst zu schaffen.

Edit: Dies würde eindeutig nur funktionieren, wenn Sie ihre API neu implementieren. Sorry - falsch verstanden. Sie wollen ein effizienten Unteranordnungsverfahren.

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

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

Sie können 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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top