Есть ли эффективный способ взять подмножество массива C# и передать его другому фрагменту кода (без изменения исходного массива)? Я использую CUDA.net, в котором есть функция, которая копирует массив в графический процессор. Я хотел бы, например, передать функции 10-ю часть массива и, таким образом, скопировать каждую 10-ю часть массива в GPU отдельно (для конвейерной обработки).
Копирование массива таким образом должно быть таким же эффективным, как и его копирование за один раз. Это можно сделать с помощью небезопасного кода и просто ссылки на правильное место в памяти, но в остальном я не уверен. Функция CopyTo копирует весь массив в другой массив, поэтому это бесполезно.





Я не уверен, насколько это эффективно, но ...
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
}
Вы можете использовать методы расширения и вернуть доход:
public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
yield return array[currentIndex];
}
В чем это неэффективно? Если вы хотите перебирать только части массива, это более эффективно, чем копирование массива.
Извините, следует объяснить это правильно. Что касается итерации, возможно, вы правы, но при использовании yield происходит множество операций. Автор вопросов автора: как скопировать подмножество массива в графический процессор, при использовании метода, описанного выше, вам нужно вызвать ToArray(), что было бы ужасно неэффективно. Метод неплохой, но имхо для этого не годится.
Ладно, раньше я неправильно понял вопрос.
Вам нужно System.Buffer.BlockCopy или System.Array.Copy.
Способы LINQ будут ужасно неэффективными. Если вы можете повторно использовать буфер, в который копируете, это также повысит эффективность, избегая создания каждый раз нового массива - просто скопируйте поверх. Если вы не можете разделить свой «большой» массив поровну, вам понадобится новый для последнего случая.
Вы можете попробовать Marshal.Copy, если вам нужно перейти от массива байтов к неуправляемому указателю. Это позволяет избежать самостоятельного создания небезопасного кода.
Обновлено: это явно будет работать только в том случае, если вы повторно реализуете их API. Извините - неправильно понял. Вам нужен эффективный метод подмассива.
Мне кажется, что вам действительно нужен api в исходном классе формы
void CopyToGpu(byte[] source, int start, int length);
Это хорошо для некоторых целей, но неэффективно, Array.Copy будет намного быстрее.