vectorized case branch

#include <utility>
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
#include <functional>
#include "cmath"

#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)

int test_vec(int M, const std::vector<int>& vec) {
    auto start = clock();
    uint32_t sum = 0;
    for (int i = 0; i < M; ++i) {
        for (auto v : vec) {
            if (likely(v < 10)) {
                sum += v;
            } else {
                sum += v * 2;
            }
        }
    }
    auto end = clock();
    std::cout << "cost:" << (double)(end - start) / CLOCKS_PER_SEC << "s" << "\n";
    return sum;
}



int main() {
    int N = 10000;
    std::vector<int> vec;
    for (int i = 0; i < N; ++i) {
        vec.emplace_back(rand() % 7);
    }
    int M = 100000;
    auto sum = test_vec(M, vec);
    return sum;
}
cost:1.42718s
sum += v < 10 ? v : 2 * v;
no-tree-vectorize none (SSE) SSE4.2 AVX2 AVX512f native
cost:1.00838s cost:0.347205s cost:0.283971s cost:0.189798s cost:0.080189s cost:0.126796s
posted @ 2021-08-19 18:52  stdpain  阅读(38)  评论(0编辑  收藏  举报