2017-04-01 134 views
-1

我想获得数组的不同部分的总和。 我运行我的代码。并从打印的内容中发现两个问题。GPU上计算得到错误的结果(python3.5 + numba + CUDA8.0)

PRO1:

详细介绍here。它已经解决了。也许这不是一个真正的问题。

PRO2:

在我的代码,我红粉不同的值SBUF [0,2],SBUF [1,2],SBUF [2,2]和SBUF [0,3],SBUF [1,3],sbuf [2,3]。

但是发现在cuda.syncthreads()之后,sbuf [0,2]和sbuf [0,3],sbuf [1,2]和sbuf [1,3],sbuf [2,2]和SBUF [2,3]。

它直接导致Xi_s,Xi1_s和Yi_s的值出错。

这些是我根据内核打印出来的猜测。

@talonmies表示依赖内核中的print语句是很危险的。

所以我想知道它是否有一个有用的方式来调试我的代码,而不是在内核中打印语句。

... 

@cuda.jit 
def calcu_T(D, T): 
    ... 

        if bx==1 and tx==1: 
         print('5,c_x,c_y,L,c_index,bx,tx,ty,sbuf[0,ty],sbuf[1,ty],sbuf[2,ty],',c_x,',',c_y,',',L,',',c_index,',',bx,',',tx,',',ty,',',sbuf[0,ty],',',sbuf[1,ty],',',sbuf[2,ty]) 

        cuda.syncthreads() 

        if bx==1 and tx==1: 
         print('1,c_x,c_y,L,c_index,bx,tx,ty,sbuf[0,ty],sbuf[1,ty],sbuf[2,ty],',c_x,',',c_y,',',L,',',c_index,',',bx,',',tx,',',ty,',',sbuf[0,ty],',',sbuf[1,ty],',',sbuf[2,ty]) 

        ... 
+0

我已经告诉过你,像这样的内核中依赖打印语句是危险的。 [SO]不是免费的调试服务。请不要把它当作一个 – talonmies

+0

是否有一个好的方法让numba进行调试?我应该将值转移到CPU进行打印以查看它是否正确? – glen

+0

http://numba.pydata.org/numba-doc/dev/cuda/simulator.html# – talonmies

回答

1

正如@talonmies所说,在内核中打印语句不是调试的好选择。如果有人有同样的问题,this documentation是有帮助的,你应该学习的更多的是pdb,尤其是调试器命令,如'p','c'。