Parallel processing OpenMP并行段依赖关系
我遇到了一个我无法解决的非常奇怪的OpenMP问题。这就是它看起来的样子 我有四个功能Parallel processing OpenMP并行段依赖关系,parallel-processing,synchronization,openmp,Parallel Processing,Synchronization,Openmp,我遇到了一个我无法解决的非常奇怪的OpenMP问题。这就是它看起来的样子 我有四个功能 function0(Data *data) { ..body.. } function1(Data *data) { ..body.. } function2(Data *data) { ..body.. } function3(Data *data) { ..body.. } 这些函数可以修改或不修改数据所指向的内容 下面是如何按顺序调用它们 // Version 1 void test(Data *d
function0(Data *data) { ..body.. }
function1(Data *data) { ..body.. }
function2(Data *data) { ..body.. }
function3(Data *data) { ..body.. }
这些函数可以修改或不修改数据所指向的内容
下面是如何按顺序调用它们
// Version 1
void test(Data *data)
{
function0(data);
function1(data);
function2(data);
function3(data);
}
我可以按照自己的意愿重新安排通话,而且效果仍然很好。所以我假设他们在某种程度上是独立的
现在当并行化
// Version 2
void test(Data *data)
{
int th_id;
#pragma omp parallel private(th_id) default(shared)
{
th_id = omp_get_thread_num();
if(th_id==0) {
function0(data);
}
if(th_id==1) {
function1(data);
}
if(th_id==2){
function2(data);
}
if(th_id==3){
function3(data);
}
}
}
它不工作(版本2)
但是,如果我在每次调用后同步线程,它就会工作
// Version 3
void test(Data *data)
{
int th_id;
#pragma omp parallel private(th_id) default(shared)
{
th_id = omp_get_thread_num();
if(th_id==0) {
function0(data);
}
#pragma omp barrier
if(th_id==1) {
function1(data);
}
#pragma omp barrier
if(th_id==2){
function2(data);
}
#pragma omp barrier
if(th_id==3){
function3(data);
}
}
}
我认为关于data
但是当我重新安排调用时,为什么它会起作用(在顺序版本1中) 假设有两个这样的函数
function0(int *data)
{
*data = *data + 1;
}
function1(int *data)
{
*data = *data + 2;
}
显然,您可以按任意顺序顺序运行这两个操作,并且在结束时,该值将增加3。
但是,如果您并行运行这两个函数,则会出现数据竞争,并且完全有可能丢失其中一个加法,因此您可以获得初始值增加1、2或3的任意值
仅仅因为函数看起来是顺序可交换的,并不意味着它们可以安全地并行运行。是的。事实证明这就是问题所在。只是函数太大太深,我无法找到问题的根源。我想我必须做一些认真的调试。谢谢