我有这个代码:
#pragma omp parallel
{
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction();
}
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction();
}
}
// and so on... up to 5 or 6 of myObject_x
// Then I sum up the buffers and do something with them
float result;
for (int i=0; i<given_number; ++i)
result = myBuffer_1[i] + myBuffer_2[i];
// do something with result
如果我运行这段代码,我得到了预期的结果,但 CPU 使用率看起来相当高。相反,如果我在没有 OpenMP 的情况下正常运行它,我会得到相同的结果,但 CPU 使用率要低得多,尽管在单个线程中运行。
我不想指定线程数,我希望程序根据 CPU 能力选择最大线程数,但我希望每个 for
循环完全独立运行线。我怎样才能做到这一点?
此外,我的期望是 myBuffer_1 的 for
循环运行一个线程,另一个 for
循环运行另一个线程,其余的在“主”线程中运行.这是正确的吗?
最佳答案
#pragma omp single
末尾有一个隐式屏障,如果你想要两个single,你需要使用
block 并发运行。#pragma omp single nowait
但是,根据您的要求,使用
section
可能是更好的主意#pragma omp parallel { #pragma omp sections { #pragma omp section { for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); } #pragma omp section { for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); } } }
关于c++ - OpenMP:每个线程都有一个完整的 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877420/