单个计算必须对每个线程可见的变量

Mat*_*ari 2 c multithreading openmp

我正在用openMP计算一个项目.在这个项目中,我需要做一个计算,特别是:

gap = (DEFAULT_HEIGHT / nthreads);
Run Code Online (Sandbox Code Playgroud)

where DEFAULT_HEIGHT是常量,nthreads 是并行区域内的线程数.我的问题是我无法计算gap 并行区域外的变量,因为我需要在里面知道nthreads .但另一方面,我不想gap 为每个线程计算.此外,我无法设置这样的代码:

if(tid==0){
    gap = (DEFAULT_HEIGHT / nthreads);
}
Run Code Online (Sandbox Code Playgroud)

因为我不知道每个线程的执行顺序,所以可能是线程0从最后开始,所有我需要的其他计算gap都是错误的(因为它不会被设置).那么,有一种方法可以在没有这个问题的情况下进行一次这种计算吗?

谢谢

Hig*_*ark 6

确保它gap是一个共享变量,并将其包含在OpenMP single指令中,例如

#pragma omp single
{ 
    gap = (DEFAULT_HEIGHT / nthreads);
}
Run Code Online (Sandbox Code Playgroud)

只有一个线程将执行single指令中包含的代码,其他线程将在封闭的代码块的末尾等待.

另一种方法是gap私有化,让所有线程计算自己的值.这可能更快,该single选项需要一些总是需要时间的同步.如果您担心,请尝试两者并比较结果.(我认为这就是ComicSansMS的建议.)