避免并行调用omp_get_thread_num()以使用simd进行循环

时间:2017-02-06 20:50:52

标签: c++ openmp

与查找变量的值相比,调用omp_get_thread_num()的性能成本是多少?

如何避免在simd openmp循环中多次调用omp_get_thread_num()?

我可以使用#pragma omp parallel,但这会产生一个simd循环吗?

#include <vector>
#include <omp.h>
int main() {
    std::vector<int> a(100);
    auto a_size = a.size(); 
    #pragma omp for simd
    for (int i = 0; i < a_size; ++i) {
        a[i] = omp_get_thread_num();
    }
}

1 个答案:

答案 0 :(得分:3)

我不会太担心通话的费用,但为了清楚代码清晰,你可以这样做:

#include <vector>
#include <omp.h>

int main() {
    std::vector<int> a(100);
    auto a_size = a.size(); 
    #pragma omp parallel
    {
        const auto threadId = omp_get_thread_num();

        #pragma omp for
        for (int i = 0; i < a_size; ++i) {
            a[i] = threadId;
        }
    }
}

只要你使用#pragma omp for(并且不要在那里添加额外的'并行!否则你的每个n个线程都会产生更多的线程......这很糟糕)它将确保在你的并行区域内,for循环在n个线程中被分割。确保打开omp编译器标志。