5

有没有一种有效的方法来获取 C# 数组的子集并将其传递给另一段代码(不修改原始数组)?我使用 CUDA.net,它具有将数组复制到 GPU 的功能。例如,我想将函数传递给数组的十分之一,从而将数组的每十分之一分别复制到 GPU(出于流水线目的)。

以这种方式复制数组应该与一次性复制它一样有效。可以使用不安全的代码并仅引用正确的内存位置来完成,但除此之外我不确定。CopyTo 函数将整个数组复制到另一个数组,因此这看起来没有用。

4

4 回答 4

12

好吧,我之前误解了这个问题。

你想要的是System.Buffer.BlockCopySystem.Array.Copy

LINQ 方法的效率会非常低。如果您能够重用要复制到的缓冲区,那也将有助于提高效率,避免每次都创建一个新数组 - 只需复制顶部即可。除非你可以将你的“大”数组平分,否则你需要一个新的来处理最后一种情况。

于 2008-11-06T12:59:50.193 回答
3

我不确定这有多有效,但是...

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
}
于 2008-11-06T12:46:28.833 回答
1

如果您需要从字节数组转到非托管指针,您可以尝试 Marshal.Copy。这样可以避免自己创建不安全的代码。

编辑:这显然只有在您重新实现他们的 API 时才有效。抱歉——误会了。您需要一种有效的子数组方法。

令我震惊的是,您真正想要的是表单原始类中的 api

void CopyToGpu(byte[] source, int start, int length);
于 2008-11-06T13:43:28.453 回答
0

您可以使用扩展方法和收益回报:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
于 2008-11-06T12:46:53.467 回答