C++ CUDA中的无序指令不起作用
我对CUDA 5.0中的无序指令有问题 这是我的内核片段。它在循环中。打印仅用于调试目的,因为我无法使用普通调试器:C++ CUDA中的无序指令不起作用,c++,cuda,shuffle,C++,Cuda,Shuffle,我对CUDA 5.0中的无序指令有问题 这是我的内核片段。它在循环中。打印仅用于调试目的,因为我无法使用普通调试器: ... tex_val = tex2D(srcTexRef, threadIdx.x + w, y_pos); if (threadIdx.x == 0) { left = left_value[y_pos]; } else { printf("thread %d; shfl value: %f \n", threadIdx.x, __shfl_up(value,
...
tex_val = tex2D(srcTexRef, threadIdx.x + w, y_pos);
if (threadIdx.x == 0)
{
left = left_value[y_pos];
}
else
{
printf("thread %d; shfl value: %f \n", threadIdx.x, __shfl_up(value, 1));
left = __shfl_up(value, 1);
}
printf("thread %d; value: %f; tex_val: %f; left: %f \n", threadIdx.x, value, tex_val, left);
...
从中我得到以下输出:
l0: ITERATION 1
l1: thread 0; value: 0; tex_val: 1; left: 4
l2:
l3: ITERATION 2
l4: thread 1; shfl value: 0
l5: thread 0; value: 5; tex_val: 1; left: 5
l6: thread 1; value: 0; tex_val: 1; left: 0
l7:
l8: ITERATION 3
l9: thread 1; shfl value: 0
l10: thread 2; shfl value: 1
l11: thread 0; value: 6; tex_val: 1; left: 6
l12: thread 1; value: 1; tex_val: 1; left: 0
l13: thread 2; value: 2; tex_val: 1; left: 1
...
从输出中,我可以看到线程1在任何迭代中都不会从线程0获得值,尽管我可以清楚地看到它有值(第4行-shfl值为0;第5行-value为5)。线程2和更高的线程可以从较低的线程获得值。我哪里出错了?这是因为分支吗?是的,这是因为分支。引述:
\uuushfl()
内部函数允许在warp内的线程之间交换变量,而无需使用共享内存。对warp中的所有活动线程同时进行交换
及
线程只能从另一个积极参与\uuu shfl()
命令的线程读取数据。如果目标线程处于非活动状态,则检索到的值未定义
在分支中,活动线程是采用相同执行路径的线程,而采用不同执行路径的线程是非活动线程。在您的情况下,线程0处于非活动状态,因此您无法从中移出。谢谢。我读过这篇文章,但我不明白什么时候线程是活动的,什么时候不是。这是关于我在学校的项目的问题。我没有nvidia图形卡,所以我必须在校园计算机上执行此项目,我没有管理员权限,因此没有nvidia调试器。