Question

Existe-t-il un moyen efficace de prendre un sous-ensemble d'un tableau C # et de le transmettre à un autre fragment de 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 transmettez à la fonction un dixième du tableau et copiez ainsi chaque dixième du tableau sur le GPU séparément (à des fins de traitement en pipeline).

Copier le tableau de cette manière devrait être aussi efficace que de le copier en une fois. Cela peut être fait avec un code non sécurisé et en faisant simplement référence au bon emplacement de mémoire, mais à part cela, je ne suis pas sûr. La fonction CopyTo copie l'intégralité du tableau dans un autre, de sorte que cela ne semble pas utile.

Était-ce utile?

La solution

D'accord, j'avais mal compris la question auparavant.

Ce que vous voulez, c'est System.Buffer.BlockCopy ou System.Array.Copy .

Les méthodes LINQ seront terriblement inefficaces. Si vous êtes en mesure de réutiliser le tampon dans lequel vous copiez, cela contribuera également à l'efficacité, en évitant de créer un nouveau tableau à chaque fois - copiez simplement par-dessus. À moins que vous ne puissiez diviser votre " gros " tableau tout aussi bien, vous aurez besoin d'un nouveau pour le dernier cas.

Autres conseils

Je ne sais pas si c'est efficace 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
}

Vous pouvez essayer Marshal.Copy si vous devez passer d'un tableau d'octets à un pointeur non géré. Cela évite de créer vous-même un code dangereux.

Éditer: Cela ne fonctionnerait clairement que si vous réimplémentiez leur API. Désolé - mal compris. Vous voulez une méthode de sous-tableau efficace.

Il me semble que ce que vous voulez vraiment, c'est une API dans la classe d'origine de la forme

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

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

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top