我正在尝试并行化包含多个过程的函数。功能如下:
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) }
}
}
关于函数procedure1()
和procedure2()
,我已将它们移植到CUDA并且一切正常(每个过程都有自己的for循环)。
这些过程分离的原因是因为它们是概念上独立的算法,与具有更一般概念的其余代码相反。
现在我正在尝试将其余代码移植到CUDA,但我不知道该怎么做。当然,如果可能的话,我想保持整个函数的相同结构。我的第一个想法是将函数_myfunction(arg1,arg2,..)
转换为内核,但我的问题是已经有两个内核函数按内部顺序执行。在某个地方,我已经读过我们可以使用流,但我不知道如何做,如果它是正确的。
问题:有人可以提示如何将程序移植到CUDA吗?
P.S:我使用的是GeForce 9600GT(Compute Capability 1.1)和CUDA Toolkit 5.0。
答案 0 :(得分:2)
相同结构 理论可能无法在CUDA中实现,因为问题可能无法并行化。这基本上是由于问题的本质。在您的设备中,您无法从另一个内核中启动内核。这种机制称为Dynamic Parallelism
并且是最近的。计算能力1.1
不支持此功能。据我所知,动态并行是自CUDA Kepler架构以来引入的。您必须进行一些研究以确定哪些设备支持此功能(当然,如果您感兴趣)。总而言之,不会能够通过相同结构 理论来实现这一目标。但 意味着根本无法实现。
以下是我的建议,以便移植您和任何其他程序:
注意#1:作为你的新手,前两个阅读是强制性的,否则你会在调试上花费很多。 注意#2:如果您在程序中没有找到问题点,我会非常怀疑您是否可以使用CUDA加速您的代码。但我会说,这是一个极端的例子。