我正在使用新的kepler的shuffle指令实现CUDA上的并行缩减,类似于:http://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/
我在给定矩阵中搜索行的最小值,并在内核的末尾我有以下代码:
my_register = min(my_register, __shfl_down(my_register,8,16));
my_register = min(my_register, __shfl_down(my_register,4,16));
my_register = min(my_register, __shfl_down(my_register,2,16));
my_register = min(my_register, __shfl_down(my_register,1,16));
Run Code Online (Sandbox Code Playgroud)
我的块是16*16,所以一切正常,使用该代码我在同一个内核中的两个子行中获得最小值.
现在我还需要返回矩阵每行中最小元素的索引,所以我打算用"if"语句替换"min"并以类似的方式处理这些索引,我对这段代码感到困惑:
if (my_reg > __shfl_down(my_reg,8,16)){my_reg = __shfl_down(my_reg,8,16);};
if (my_reg > __shfl_down(my_reg,4,16)){my_reg = __shfl_down(my_reg,4,16);};
if (my_reg > __shfl_down(my_reg,2,16)){my_reg = __shfl_down(my_reg,2,16);};
if (my_reg > __shfl_down(my_reg,1,16)){my_reg = __shfl_down(my_reg,1,16);};
Run Code Online (Sandbox Code Playgroud)
没有cudaErrors,但内核现在返回垃圾.不过我已经解决了这个问题:
myreg_tmp = __shfl_down(myreg,8,16);
if (myreg > myreg_tmp){myreg = myreg_tmp;};
myreg_tmp = __shfl_down(myreg,4,16);
if (myreg > myreg_tmp){myreg = myreg_tmp;};
myreg_tmp = __shfl_down(myreg,2,16);
if (myreg > myreg_tmp){myreg = myreg_tmp;};
myreg_tmp = __shfl_down(myreg,1,16);
if (myreg > …
Run Code Online (Sandbox Code Playgroud)