我有这段代码:
#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
循环运行另一个线程,其余的运行在&#39; master&#39;线。这是对的吗?
答案 0 :(得分:0)
#pragma omp single
最后有一个隐含障碍,如果您希望同时运行两个#pragma omp single nowait
块,则需要使用single
。
但是,根据您的要求,使用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();
}
}
}