Вопрос

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

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

Это было полезно?

Решение

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

Вы хотите System.Buffer.BlockCopy или System.Array.Copy .

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

Другие советы

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

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
}

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

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

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

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

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

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top