【问题标题】:Getting array subsets efficiently有效获取数组子集
【发布时间】:2010-09-21 01:50:24
【问题描述】:

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

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

【问题讨论】:

    标签: c# arrays cuda cuda.net


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      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
      }
      

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          您可以使用扩展方法并产生返回:

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

          【讨论】:

          • 这对某些目的来说很好,但效率不高,Array.Copy 会快得多。
          • 在什么方面效率不高?如果你只想迭代数组的一部分,它比复制数组更有效。
          • 对不起应该用正确的方式解释。对于迭代,您可能是对的,但是在使用 yield 时会发生很多操作。作者的问题是如何将数组的子集复制到gpu,当使用上述方法时,您需要调用ToArray(),这将是非常低效的。恕我直言,该方法不错,但不适合此目的。
          猜你喜欢
          • 2010-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 2015-06-22
          • 1970-01-01
          • 2018-02-03
          相关资源
          最近更新 更多