【发布时间】:2013-07-02 19:59:40
【问题描述】:
我正在尝试并行化包含多个过程的函数。函数如下:
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。
【问题讨论】:
-
可以通过 dynamic parallelism 在另一个 CUDA 内核中调用内核,这适用于具有计算能力 >=
3.5的卡。关于流,请查看simpleStreamsSDK 示例。您可以考虑将在外部for循环中调用的内核的执行分配给不同的流,但是 1)执行必须是独立的; 2)我不知道你的卡是否真的支持并发内核执行。