Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cuda算法结构_C++_C_Algorithm_Cuda - Fatal编程技术网

C++ cuda算法结构

C++ cuda算法结构,c++,c,algorithm,cuda,C++,C,Algorithm,Cuda,我想了解使用CUDA在GPU上执行以下操作的一般方法 我有一个算法,可能看起来像这样: void DoStuff(int[,] inputMatrix, int[,] outputMatrix) { forloop { forloop { if (something) { DoStuffA(inputMatrix,a,b,c,outputMatrix) } else {

我想了解使用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(它们并行执行)。i、 e.外环部分为单螺纹,但内环部分不是


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

这取决于for循环中数据之间的相互关系,但大致上我会这样做

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

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

    forloops是什么?它们是对输入的简单迭代器,还是更复杂的东西。对于DoStuff的单个调用,条件(某物)是常量,还是取决于输出矩阵的状态?不,forloops不是简单的迭代器,条件也很复杂。总之,我意识到我可以让“DoStuff”方法在CPU上运行,然后多次调用GPU获取DoStuffA和DoStuffB,但是我希望避免重复将矩阵从CPU复制到GPU,即将DoStuff放在GPU上。你能将细节编辑到你的问题中吗?这是一个相当抽象的问题,很难建设性地回答。不要考虑线程,要考虑数据并行工作。在GPU上运行的内核只能做数据并行工作,它们不能分派新的工作或运行其他内核。因此,通常,“内部”foreach循环在GPU上运行,“外部”循环包含收敛测试或主机上的类似测试。在细化问题时请记住这一点,现在您对执行模型的理解听起来有点粗略。我认为您的评论很好地回答了我的问题。非常感谢。基本上你是说,一般来说,对于算法来说,算法的外部部分(包括它的所有决策等)在CPU上完成,而简单的并行位在GPU上完成。