vectorized case sum

在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

https://quick-bench.com/q/CZRlNcb6YPnb6f3-aSQjyN8qISs

原文地址:https://www.cnblogs.com/stdpain/p/15396445.html