在sum算子中,我们的实现的大概逻辑是这样的:
void batch_update2(int* res, int col[],int size) {
for(int i = 0;i < size; ++i) {
*res += col[i];
}
}
GCC 没有办法向量化,因为不知道 res的地址是否和col的地址有交集
其中一个解决方案就是利用一个局部变量
void batch_update1(int* res, int col[],int size) {
int tmp{};
for(int i = 0;i < size; ++i) {
tmp += col[i];
}
*res += tmp;
}
另一个办法就是关键字: __restrict
void batch_update3(int* __restrict res, int* __restrict col,int size) {
for(int i = 0;i < size; ++i) {
*res += col[i];
}
}
https://godbolt.org/z/hh84jP9f8
benchmark