与查找变量的值相比,调用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();
}
}
答案 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编译器标志。