2008-11-06 14 views
5

Existe-t-il un moyen efficace de prendre un sous-ensemble d'un tableau C# et de le passer à un autre code (sans modifier le tableau d'origine)? J'utilise CUDA.net qui a une fonction qui copie un tableau sur le GPU. Je voudrais par exemple passez la fonction à un 10ème du tableau et copiez ainsi chaque 10ème du tableau sur le GPU séparément (à des fins de pipelining).Obtention efficace de sous-ensembles de tableaux

La copie de la matrice de cette manière devrait être aussi efficace que la copie en une fois. Cela peut être fait avec un code dangereux et en référençant juste l'emplacement de mémoire approprié mais à part ça je ne suis pas sûr. La fonction CopyTo copie le tableau entier dans un autre tableau, cela ne semble donc pas utile.

Répondre

11

D'accord, je mal compris la question avant. Ce que vous voulez est System.Buffer.BlockCopy ou System.Array.Copy.

Les chemins LINQ seront terriblement inefficaces. Si vous êtes capable de réutiliser le tampon dans lequel vous copiez, cela contribuera également à l'efficacité, en évitant de créer un nouveau tableau à chaque fois - il suffit de copier par-dessus. Sauf si vous pouvez diviser votre "grand" tableau de manière égale, vous aurez besoin d'un nouveau pour le dernier cas.

3

Je ne sais pas comment efficace c'est mais ...

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

Vous pouvez utiliser des méthodes d'extension et retour de rendement:

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

Cest bon pour certaines fins mais c'est pas efficace, un Array.Copy serait beaucoup plus rapide. –

+0

En quoi n'est-ce pas efficace? Si vous voulez seulement parcourir des parties d'un tableau, c'est plus efficace que de copier un tableau. –

+0

Désolé devrait expliquer dans le bon sens. Pour l'itération, vous avez peut-être raison, mais il y a beaucoup d'opérations qui se produisent lorsque vous utilisez 'yield'. L'auteur de questions de l'auteur est comment copier un sous-ensemble d'un tableau au gpu, en utilisant la méthode décrite ci-dessus vous devez appeler 'ToArray()' ce qui serait terriblement inefficace. La méthode n'est pas mauvaise mais pas bonne à cet effet à mon humble avis. –

1

Vous pouvez essayer Marshal.Copy si vous devez passer d'un tableau d'octets à un pointeur non géré. Cela évite de créer du code dangereux vous-même. Edit: Cela ne fonctionnerait clairement que si vous réimplémentez leur API. Désolé - mal compris. Vous voulez une méthode de sous-réseau efficace.

Il me semble que ce que vous voulez vraiment est une api dans la classe originale de la forme

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