通俗的说这里的归约就是求和,比如:
for(i = 0; i < n; i++){
sum += a[i];
}
这里主要对比较正常写代码的归约和循环展开以及SSE指令向量归约操作的比较。
话不多说,上代码:
#include <stdio.h>
#include <x86intrin.h>
#include <time.h>
#include <stdlib.h>
//正常处理的数组归约
int normal_add(int *a, int n){
int sum = 0;
int i;
for(i = 0; i < n; i++){
sum += a[i];
}
return sum;
}
//正常数组归约的四层循环展开
int normal_add_loop(int *a, int n){
int sum = 0;
int i;
int block = n / 4;
int reserve = n % 4;
for(i = 0; i < block; i++){
sum += *a;
sum += *(a+1);
sum += *(a+2);
sum += *(a+3);
a += 4;
}
for(i = 0; i < reserve; i++){
sum += a[i];
}
return sum;
}
//sse指令向量归约(一个寄存器,