,
初始化循环控制变量;
again:
循环控制--循环变量增加;
循环控制--判断下次是否应当循环;
干活;
干活;
干活;
干活;
循环控制--计算调转地址;
循环控制--等待循环内部依赖的资源可用...(例如soft barrier)
循环控制--执行判断结果下的调转到again (一共16次本跳转)
而变成展开后:
(2)
干活;
干活;
......当一个循环的次数非常巨大, 往往不可能完全展开.例如1000次循环, 展开后代码将爆掉你的GPU卡上的代码缓存.所以本章节的#pragma unroll N后面允许跟随一个常数N
例如将1000次循环,...虽然这里最多会存在A[0], A[1], A[2]三个,
但是只要i难以在编译时刻确定, (例如你的i来自某个计算才进入循环, 或者循环内部有计算, 变换了i),编译器因为无法对寄存器进行索引操作, 不得不使用...local memory(它可以被索引),此时将会导致缓慢的local memory传输.而一旦你对该循环进行了unroll后, 例如3X展开, 编译器有可能发现3X展开后的循环体中的对A[]的使用,