CUDA中的随机播放指令无法正常工作

时间:2015-05-07 08:38:18

标签: c++ cuda shuffle

我在CUDA 5.0中遇到了shuffle指令的问题。

这是我内核的片段。它在循环内。打印仅用于调试目的,因为我无法使用普通调试器:

...
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行 - 值为5 )。线程2和更高版本可以从底线获取值。我哪里弄错了?它是否因为分支而发生?

1 个答案:

答案 0 :(得分:7)

是的,这是因为分支。引自DEMO

  

__shfl()内在函数允许在不使用共享内存的情况下在warp中的线程之间交换变量。对于warp中的所有活动线程同时进行交换,...​​

  

线程只能从正在参与{{1}}命令的另一个线程中读取数据。如果目标线程处于非活动状态,则检索到的值未定义。

在分支中,活动线程是采用相同执行路径的线程,而采用不同线程的线程是不活动的。在您的情况下,线程0处于非活动状态,因此您无法进行随机播放。

相关问题