在如下代码中:
#pragma unroll
for( int offset = 1 ; offset < 4; offset *= 2 )
{
int n = __shfl_up( num_pts, offset, 4);
if( lane_id >= offset )
num_pts += n;
}
if( lane_id < 4) s_num_pts[warp_id][lane_id] = num_pts;
循环是以怎样的方式进行展开的呢?这段代码截取于CUDA5.0的四叉树例子中。
我理解的意思,其目的应该是将id值小于当前线程id值得所有线程的num_pts值叠加到当前线程的num_pts值上。
但具体是如何实现的呢?还是我理解错了。。。求解答
楼主您好,您的循环次数已知(2次),所以哪怕您没有指定unroll多少次,也将会被完全展开。
对于有数量指定的#pragma unroll n, 则会unroll n次,例如一个M次的循环,将被展开为M/N次循环,每次里面有原来M个循环体的内容(假设M/N是整数。不是整数则将最后处理尾巴部分)。
而如果没有指定次数,编译器会对常数的循环进行完全拆开(如同您指定了#pragma unroll 循环次数), 但次数编译时刻无法确定这个循环次数,则它将不会进行任何展开(因为它没办法)。
int n = __shfl_up( num_pts, 1, 4);
if( lane_id >= 1 )
num_pts += n;
int n = __shfl_up( num_pts, 2, 4);
if( lane_id >= 2 )
num_pts += n;
您的循环循环运行两次,展开后大致如上。
供您参考,祝您好运!