干活; (一共4x5 = 20条)
你可以看到, 通过添加了#pragma unroll指令, 循环控制本身的成本倍彻底消除了....,则编译器在接受到你的循环展开指示后, 会发现多个global memory的读取, 有可能允许同时进行中多份, 而不是必须等待一个读取完成, 才能+1,此时就有可能发掘出来额外的性能....然后循环多次后(例如20次展开):
IADD R0, R0, 80; //下20次原本的循环只需要计算1次基地址即可.这样, 编译器可以直接利用访存指令内置的立即数偏移量(0, 4, 8, 12这些),...此时将增加I-Cache的抖动, 特别是在你使用多个stream同时启动多个kernel的时候将更加显著.I-Cache的抖动将反向的降低性能.如果你用profiler分析Maxwell或者更高计算能力的卡上的...,你可以用profiler(上面)观察kernel,也可以直接感觉kernel的运行时间---cache剧烈抖动往往会导致明显的性能下降, 和运行时间增加)
这是第一点.