Domanda

Esiste un modo efficiente per prendere un sottoinsieme di un array C # e passarlo a un'altra porzione di codice (senza modificare l'array originale)? Uso CUDA.net che ha una funzione che copia un array sulla GPU. Vorrei ad es. passare la funzione un decimo dell'array e quindi copiare ogni decimo dell'array nella GPU separatamente (per scopi di pipeline).

Copiare l'array in questo modo dovrebbe essere efficiente come copiarlo in una volta sola. Può essere fatto con un codice non sicuro e facendo semplicemente riferimento alla posizione di memoria corretta, ma a parte questo non ne sono sicuro. La funzione Copia su copia l'intero array su un altro array in modo che ciò non appaia utile.

È stato utile?

Soluzione

Va ??bene, avevo frainteso la domanda prima.

Quello che vuoi è System.Buffer.BlockCopy o System.Array.Copy .

Le modalità LINQ saranno orribilmente inefficienti. Se riesci a riutilizzare il buffer in cui stai copiando, ciò contribuirà anche all'efficienza, evitando di creare un nuovo array ogni volta, basta copiarlo sopra. A meno che tu non possa dividere il tuo "grande" schierare equamente, tuttavia, ne avrai bisogno uno nuovo per l'ultimo caso.

Altri suggerimenti

Non sono sicuro di quanto sia efficiente, ma ...

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
}

Potresti provare Marshal.Copy se devi passare da una matrice di byte a un puntatore non gestito. Ciò evita di creare tu stesso un codice non sicuro.

Modifica: funzionerebbe chiaramente solo se reimplementassi la loro API. Siamo spiacenti, frainteso. Volete un metodo di subarray efficiente.

Mi sembra che quello che vuoi davvero sia un'API nella classe originale del modulo

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

È possibile utilizzare metodi di estensione e rendimento:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top