我向this chap提出了一个非常相似的问题,但那里只有一个答案,但对我来说并没有用。
我在main()
中有一个并行区域,其中一个for循环调用函数new_value()
:
int main(int argc, char** argv)
{
omp_set_num_threads(4);
#pragma omp parallel default(shared) private(...)
{
for(int i = 0; i < MAX_VALUE; i++)
new_value(...);
}
return 0;
}
new_value()
看起来像:
void new_value(...)
{
#pragma omp for schedule(static, chunk_width)
for(int i = 0; i < N; i++)
arr[i] = update();
}
我遇到的问题是我不希望main()
中的for循环被并行化(即总共运行MAX_VALUE * 4
次)。
我基本上希望一个循环可以串行运行,但new_value()
中的for循环可以用四个线程运行。
我在循环之前尝试了#pragma omp single
,但它导致程序死锁或挂起。我也尝试了已经linked线程建议的嵌套并行方法,但我得到了相同的结果。
任何解决方案都将受到赞赏。
答案 0 :(得分:1)
void new_value(...){
#pragma omp parallel for num_threads(4)
for(int i = 0; i < N; i++)
arr[i] = update();
}
int main(int argc, char** argv){
for(int i = 0; i < MAX_VALUE; i++)
new_value(...);
return 0;
}