CUDA循环展开
串行循环展开
loop unrolling是一种牺牲程序的尺寸来加快执行速度的优化方法。拿数组来说,数组的数据在内存中是连续存储的,每次取数据的时候可以一次抓取相邻的多个数据,从而减少从内存中读取数据的时间,优化程序。 例子 :
假设n可以被4整除
未展开程序
for(int i = 0; i < n; i++){
c[i] = a[i] + b[i];
}
4层展开程序
for(int i = 0; i < n/4; i++){
c[i] = a[i] + b[i];
c[i+1] = a[i+1] + b[i+1];
c[i+2] = a[i+2] + b[i+2];
c[i+3] = a[i+3] + b[i+3];
}
GPU并行循环展开
在GPU上,同样的也可以进行循环展开优化, 更重要的是展开可以减少warp总得分支,下面是一个简单的程序,将value写入out的N个元素中。