想要并行化的函数主要处理下面这个问题,
对于一个二维矩阵中的每一个位置点,需要进行一次计算得到一个结果,但是每个位置的结果要依赖于当前点位置上一列或上一行的结果,也就是说存在一定的依赖关系,所以并不能一个线程来计算一个位置点。现在有一个想法是这样的:
首先CPU中计算得到矩阵第一行的结果,然后设置一个线程负责一列的计算,当计算完列中的一个点之后循环向下计算下一个点,直到这一列计算结束。但现在的问题是单个位置的结果计算就比较复杂,如果一个线程来负责一列的计算的话计算量会过大,加速效果并不明显。卡是gtx1060,不知道有没有类似的更好一点的思想来处理这个问题来达到更高的并行度。
还一个问题是程序在Nsight下可以调试输出结果,但是主机端跑的时候貌似会跳过核函数未进行计算,此程序之前可以正常运行得到结果,但后来不知道什么原因就突然不能正常跑了。比较玄学
想知道有什么原因会导致上面这个问题,
麻烦[名词6]答疑,谢谢啦
如果矩阵每一行算完了,才能继续下一行,正常情况下,我建议你使用CPU进行计算。真的。
但如果你同时有多种这样的矩阵,则可以考虑用GPU(等效于任务并行了)。
关于你的第二个问题,光这样看,看不出什么,我建议你执行如下步骤:
your_kernel<<<>>>(....);
cudaError_t r0 = cudaGetLastError();
cudaError_t r1 = cudaDeviceSynchronize();
分别检查r0和r1是否为cudaSuccess(0), 从而确定是否真的“kernel并未执行”,或者中途挂掉,而不是凭感觉。