gpt4 book ai didi

c++ - 避免使用 simd 并行调用 omp_get_thread_num() for 循环

转载 作者:行者123 更新时间:2023-11-27 23:56:51 25 4
gpt4 key购买 nike

与查找变量值相比,调用 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();
}
}

最佳答案

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

#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(并且不要在其中放置额外的`parallel!否则你的n个线程中的每一个都会产生n个更多的线程......这很糟糕)它将确保在您的并行区域内,for 循环在 n 个线程之间拆分。确保打开 omp 编译器标志。

关于c++ - 避免使用 simd 并行调用 omp_get_thread_num() for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42077050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com