我想了解使用CUDA在GPU上执行以下操作的一般方法。

我有一个算法可能看起来像这样:

void DoStuff(int[,] inputMatrix, int[,] outputMatrix)
{
   forloop {
     forloop {
         if (something) {
                DoStuffA(inputMatrix,a,b,c,outputMatrix)
         }
         else {
               DoStuffB(inputMatrix,a,b,c,outputMatrix)
         }
     }
   }
}

DoStuffA和DoStuffB是CUDA示例具有的简单可并行化的函数(例如执行矩阵行操作)。

我想做的是知道如何将主要算法“DoStuff”放到GPU上,然后在需要时调用DoStuffA和DoStuffB(它们并行执行)。即外部循环部分是单线程的,但是内部调用不是。

我看到的示例从一开始就似乎是多线程的。我假设有一种方法可以从外界调用单个基于GPU的方法,并让它自己控制所有并行位?

最佳答案

它取决于数据在for循环中相互之间的关系,但我大致会

  • 将所有输入矩阵打包到一块内存中
  • 上传输入矩阵
  • 在CPU上执行for循环,为DoStuffA和DoStuffB调用内核
  • 将输出矩阵下载为一个块

  • 这样,最大的问题是调用每个内核的开销。如果您的输入数据很大,那也不会太糟糕。

    10-02 12:48