gpt4 book ai didi

c - 是否可以在没有线程0的情况下运行omp?

转载 作者:行者123 更新时间:2023-11-30 14:38:12 25 4
gpt4 key购买 nike

我有一个用例,我想要并行运行两个函数:第一个包含我想要在线程 0 中执行的工作,另一个包含我想要在其余 3 个函数之间共享的“for”循环线程。我的代码是这样的:

void fct1(){
//do some work1
};

void fct2(){
int p;
#pragma omp for schedule(static)
for (p=start; p < end; p++) {
//do some work2
}
};

int main(){
#pragma omp parallel
{
int tid = omp_get_thread_num();
if (tid==0)
fct1();

if(tid!=0)
fct2();
}
return 0;
}

问题在于 fct2 中的“omp for”挂起,因为它还等待线程 0 执行其部分。

你有什么建议吗?谢谢。

最佳答案

您可以使用single(或master,如果您确实想要线程0)编译指示来做到这一点。 nowait 指令将允许其他线程继续运行。

您应该在 for 循环中使用动态调度,因为它可以更好地处理可变数量的线程。如果线程 0 完成了工作,它将加入池中。

#include <stdio.h>
#include <omp.h>

#define end 2000

void fct1(){
printf("Hey I am thread %d\n", omp_get_thread_num());
};

void fct2(){
int p;
# pragma omp for schedule(dynamic,128) // adapt chunk size to your problem
for (p=0; p < end; p++) {
printf("%d (%d)\t",p,omp_get_thread_num());
} // all, including thread 0, will be synchronized here
};

int main(){
# pragma omp parallel
{
# pragma omp single nowait
fct1();

fct2();
}
return 0;
}

关于c - 是否可以在没有线程0的情况下运行omp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56750622/

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