Эффективное получение подмножеств массива - PullRequest
5 голосов
/ 06 ноября 2008

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

Копирование массива таким способом должно быть таким же эффективным, как и копирование за один раз. Это может быть сделано с помощью небезопасного кода и просто ссылки на правильную область памяти, но кроме этого я не уверен. Функция CopyTo копирует весь массив в другой массив, поэтому это не выглядит полезным.

Ответы [ 4 ]

11 голосов
/ 06 ноября 2008

Хорошо, я бы неправильно понял вопрос раньше.

То, что вы хотите, это System.Buffer.BlockCopy или System.Array.Copy .

Пути LINQ будут ужасно неэффективными. Если вы сможете повторно использовать буфер, в который копируете, это также поможет повысить эффективность, избегая создания нового массива каждый раз - просто скопируйте поверх. Если вы не можете разделить ваш «большой» массив поровну, вам понадобится новый для последнего случая.

3 голосов
/ 06 ноября 2008

Я не уверен, насколько это эффективно, но ...

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
}
1 голос
/ 06 ноября 2008

Вы можете попробовать Marshal.Copy, если вам нужно перейти от массива байтов к неуправляемому указателю. Это позволяет избежать создания небезопасного кода самостоятельно.

Редактировать: Очевидно, это сработает, только если вы переопределите их API. Извините - неправильно понял. Вы хотите эффективный метод подмассива.

Мне кажется, что вы действительно хотите API в оригинальном классе вида

void CopyToGpu(byte[] source, int start, int length);
0 голосов
/ 06 ноября 2008

Вы можете использовать методы расширения и возвращать доход:

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