但是本章节说的却不是这个, 而是指的kernel的代码内部,一个GPU上的线程在执行的过程中, 它所进行的循环(串行)处理, 通过本章节提供的#pragma unroll指示性语句, 要求编译器自动将kernel...每20次展开, 这样从原本的1000次循环, 每次干1个活,变成了循环50次(1000/20=50), 每次干20个活,这样虽然不能完全展开, 但控制成本变成了原本的1/20,同时编译器生成的目标代码体积...(3)循环unroll后, 还能让编译器充分利用硬件的能力, 压榨每条指令的潜力, 提升性能: 例如我们经常写的循环体代码中, 有这样的计算:
a[base + i * 4] = ...;
其中i是循环控制变量...然后循环多次后(例如20次展开):
IADD R0, R0, 80; //下20次原本的循环只需要计算1次基地址即可.这样, 编译器可以直接利用访存指令内置的立即数偏移量(0, 4, 8, 12这些),...(注意不是完全消除了, 但是现在每20次只需要一条SP的IADD整数加法指令加上80而已,而不进行循环unroll, 则需要每次都至少一条IADD),这样通过这种方式, 释放了宝贵的SP资源(特别是卡计算