算法改写

CPU上串行算法如下形式:
void pu( )
{
for(int row=2;row<width+2;row++)
{
for(int col=2;col<width+2;col++)
{
A[row*(width+2)+col]=…;
B[row*(width+2)+col]=…;
}
}
for(int row=2;row<width+2;row++)
{
for(int col=2;col<width+2;col++)
{
if(A[row*(width+2)+col]>=0.1 || A[row*(width+2)+col]<=-0.1)
{……}
else
{……}
}
}
}
那么,如何将这种串行算法改写成适合GPU上 的算法呢? 在线等大神指导!

LZ您好,一种实现思路如下,仅作为示例,供您参考。

假定您有row行col列,原先是循环rowcol次进行处理,现在可以使用rowcol个线程来计算,每个线程完成原有一次循环的工作。

您的两组循环都可以这样实现,只是第二组循环中有判断语句,如果没有特别的规律的话,会引起warp内分支,造成一定程度的效能下降。

大致如此,供您参考,祝您编码愉快~

我是使用row*col个线程来计算的,但是现在有个问题,我使用Nsight设置断点逐步对核函数进行调试,中途进行到某一步时,跳出调试黑框,然后接着电脑几乎处于貌似死机状态好长时间,等回复正常后输出窗口中提示“Parallel Nsight Debug
CUDA grid launch failed: CUcontext: 15494264 CUmodule: 68365520 Function:
_Z16Phase_Compute_puPfS_S_S_S_S_S_S_S_S_S_j”,导致无法继续进行调试,不知这是什么原因导致的? 若有说的不清楚的地方,还望指出,我会继续跟帖。

额,肿么没高手们给解答一下下啊?

LZ您好,您顶楼的问题已经在2#给出建议。

您3#的问题,我不清楚是何原因,建议升级到最新版的nsight,以及仔细检查下您的代码有无问题。

大致如此,请您参考。

又隔了好几天。。。谢谢斑竹的建议,但是问题仍未能解决。现我将一直以来存在的问题描述如下:
我的算法是一次次的迭代计算,所以我在主函数中有个while循环,对核函数进行多次计算,循环一次,执行一次核函数,进行一次迭代计算,但是从程序最终的执行结果输出的一直都是第一次执行完核函数后的结果,并没有进行核函数的多次迭代计算(核函数中if…else…分支较多)。这是什么原因呢?

LZ您好,我估计是您代码的问题。

在host端反复启动kernel运算是可以的,不会有问题,我连续循环过上千次都没问题的。

这个和kernel中是否有if-else分支是无关的,如果您kernel里面的if-else分支逻辑是无误的,那么最多影响效率,不会出现错误结果。

所以,我的建议是您再检查下host端的代码看有没有bug,以及检查下kernel里面的if-else逻辑,会否导致kernel不干活。如果都没问题的话,这个现象确实诡异了。

祝您编码愉快~

好的,我再仔细排查一下代码。。。