这是我想要的例子。
#include <stdio.h>
#include <omp.h>
void increment1(){
int x;
x=0;
for(int i = 0; i<30000000000000;i++){
++x;
}
printf("%d\n",x );
}
int main(){
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
{ increment1(); }
}
}
printf("Continue\n" );
return 0;
}
如您所见,increment1()
需要太多时间才能完成。我的问题是如何在后台设置此任务,并在printf("Continue\n" );
完成后先打印printf("%d\n",x );
消息,然后打印increment1()
。
也尝试过OpenMP run threads but continue main,但不起作用
答案 0 :(得分:0)
OpenMP无法像这样工作。通常,您使用OpenMP使increment1
中的循环运行得更快,例如通过应用#pragma omp parallel for
。当然,具体的工作共享方法取决于您的 actual 函数的作用。
如果您确实需要使用功能并行性,即同时运行不同的功能,请所有应该同时运行的功能(因此包括执行printf
的代码)必须在section
s(或task
s)内。
答案 1 :(得分:0)
您可以使用omp任务:
int main() {
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
increment1(300000000);
#pragma omp task // if you leave out this pragma the printf will be executed
// by the same thread that created the increment1 task
// otherwise it can be scheduled by any OMP thread
printf("continue\n");
#pragma omp taskwait
}
}
return 0;
}
此示例将创建两个任务(一个用于increment1
函数,一个用于printf("continue\n")
,将在OMP线程之间分配。这些任务可以按任何顺序安排,但是当有更多任务时OMP线程比任务将同时调度。
附加说明:#pragma omp single
指令在那里,因此任务只能由一个线程创建。否则,每个线程都会为increment1
和printf
语句创建任务。