- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与查找变量值相比,调用 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/
代码有几千行,所以我不能粘贴它们,但是函数流程看起来有点像: void Func_1(double * x, int nx, NUM_THREADS) { omp_set_num_threads(
我刚开始使用英特尔 Fortran 编译器和 Visual Studio 2015 在 Fortran 中使用 OpenMP。在项目属性中,我将“Fortran -> 语言 -> 处理 OpenMP
我有一个这样的代码: thread_local CustomAllocator* ts_alloc = nullptr; struct AllocatorSetup { AllocatorSe
与查找变量值相比,调用 omp_get_thread_num() 的性能成本是多少? 如何避免在 simd openmp 循环中多次调用 omp_get_thread_num()? 我可以使用 #pr
我有一个使用 omp 进行并行化的 C++ 类库。我注意到我的问题,因为它总是用完我处理器上的所有内核,不管 omp_set_num_threads(threadCount) 有什么作为输入。 所以在
我了解到 OpenMP 使用线程池来重用物理线程。我的问题是从omp_get_thread_num 获取的线程号是否绑定(bind)到物理线程? 换句话说,omp_get_thread_num 到 g
我是一名优秀的程序员,十分优秀!