将一个程序移植到另一个内核中的CUDA内核?

将一个程序移植到另一个内核中的CUDA内核?,cuda,gpu,porting,Cuda,Gpu,Porting,我正在尝试并行化一个包含多个过程的函数。功能如下: void _myfunction(M1,M2){ for (a = 0; a < A; a++) { Amatrix = procedure1(M1) /*contains for loops*/; Bmatrix = procedure2(M1) /*contains for loops*/; ... for ( z = 1 ; z < Z ; z++ ){

我正在尝试并行化一个包含多个过程的函数。功能如下:

void _myfunction(M1,M2){
    for (a = 0; a < A; a++) {
       Amatrix = procedure1(M1) /*contains for loops*/;
       Bmatrix = procedure2(M1) /*contains for loops*/;

       ...
       for ( z = 1 ; z < Z ; z++ ){
                 calculations with Amatrix(z) and obtain AAmatrix 
                 calculations with Bmatrix(z) and obtain BBmatrix    
          for ( e = 1; e < E; e++) { 
                 calculations with AAmatrix(e) and obtain CCmatrix 
                 calculations with BBmatrix(e) and obtain DDmatrix
          }
       }
       for (q = 0; q < Q; q++){ calculations with CCMatrix(q) }
       for (m = 0; m < M; m++){ calculations with DDMatrix(q) }
    }
}
void\u myfunction(M1,M2){
对于(a=0;a
关于函数
procedure1()
procedure2()
,我已经将它们移植到CUDA,一切都很顺利(每个过程都有自己的for循环)。 这些过程被分离的原因是,它们是概念上独立的算法,与代码中具有更一般概念的其余部分相反

现在我正在尝试将其余代码移植到CUDA,但我不确定该怎么做。当然,如果可能的话,我想保持整个函数的结构相同。我的第一个想法是将函数
\u myfunction(arg1,arg2,…)
转换成一个内核,但我的问题是,内核中已经有两个按顺序执行的内核函数。我在某个地方读到,我们可以使用流,但我同样不确定如何使用流,以及它是否正确

问题:有人能提示一下如何将程序移植到CUDA吗


注:我正在使用GeForce 9600GT(计算能力1.1)和CUDA Toolkit 5.0。

相同的结构理论在CUDA中可能无法实现,因为问题可能无法并行化。这基本上是由于问题的性质。在您的设备中,您不能从另一个内核中启动内核。这种机制被称为,而且是最近才出现的。计算能力
1.1
不支持此功能。据我所知,动态并行是从CUDA开普勒体系结构开始引入的。您必须进行一些研究,以确定哪些设备支持此功能(当然,如果您感兴趣的话)。总而言之,你不能用相同的结构理论来实现这一点。但这并不意味着你根本无法实现它。 以下是我的建议,以便移植您和任何其他计划:

  • 阅读和(假设您使用CUDA C)
  • 重新构造/重新思考原始问题,看看它是否可以并行化
  • 对代码执行静态分析。(基本上阅读代码并根据您的编程知识使事情变得更快)
  • 对代码执行动态分析。您可以通过工具实现这一点。我推荐你。它有广泛的用途,它是免费的,它有许多不同的模块,可以帮助你检查程序的不同方面,并且它在很多平台上都得到支持。我用过,我觉得很好
  • 在这两次分析之后,您将查找程序中的问题点,例如,占用程序大部分执行时间的问题点
  • 尝试将这些点平行化。正如我所说,结构不必是相同的
  • 注#1:作为一名新手,前两个阅读是必须的,否则你会在调试上花很多钱。
    注#2:如果你在程序中没有发现有问题的地方,我会非常怀疑你能用CUDA加速你的代码。但我想说,这是一个极端的情况。

    在另一个CUDA内核中调用内核是可能的,通过它,具有计算能力的卡可以使用>=
    3.5
    。关于流,请看一下
    simpleStreams
    SDK示例。您可以考虑将外部
    for
    循环中调用的内核的执行分配给不同的流,但是1)执行必须是独立的;2) 我不知道你的卡是否真的支持并发内核执行。