有效地获取数组子集

时间:2008-11-06 12:33:22

标签: c# arrays cuda cuda.net

是否有一种有效的方法来获取C#数组的子集并将其传递给另一个代码(不修改原始数组)?我使用CUDA.net,它具有将数组复制到GPU的功能。我想,例如将函数传递给数组的第10个,从而将每个数组的第10个单独复制到GPU(用于流水线操作)。

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

4 个答案:

答案 0 :(得分:11)

好的,我以前误解了这个问题。

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

LINQ方式将非常低效。如果你能够重用你正在复制的缓冲区,这也有助于提高效率,避免每次创建一个新数组 - 只需复制到顶部。除非你可以将你的“大”阵列平分,但你需要为最后一个案例添加一个新的阵列。

答案 1 :(得分: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
}

答案 2 :(得分:1)

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

编辑:这显然只有在您重新实现其API时才有效。对不起 - 被误解了。你想要一个有效的子阵列方法。

令我感到震惊的是,你真正想要的是形式的原始类中的api

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

答案 3 :(得分:0)

您可以使用扩展方法并收益率返回:

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