OpenMP和嵌套for循环以及continue语句
我有以下代码:OpenMP和嵌套for循环以及continue语句,c,openmp,C,Openmp,我有以下代码: int myArray[] = {0, 0, 0, 0, 0, 0}; double EV = 0; for(short a1 = 1; a1 <= 6; ++a1) { ++myArray[a1-1]; if(....) { --myArray[a1-1]; continue; } EV = myEVFunc(); if(EV...) { for(short a2 =
int myArray[] = {0, 0, 0, 0, 0, 0};
double EV = 0;
for(short a1 = 1; a1 <= 6; ++a1)
{
++myArray[a1-1];
if(....)
{
--myArray[a1-1];
continue;
}
EV = myEVFunc();
if(EV...)
{
for(short a2 = 1; a2 <=6 ; ++a2)
{
++myArray[a2-1];
if(....)
{
--myArray[a2-1];
continue;
}
EV = myEVFunc();
if(EV...)
{
for(short a3 = 1; a3 <= 6; ++a3)
{
++myArray[a3-1];
if(....)
{
--myArray[a3-1];
continue;
}
EV = myEVFunc();
}
}
}
}
}
intmyarray[]={0,0,0,0,0};
双EV=0;
对于(简言之,a1=1;a1我将指出两件显而易见的事情:
1.double EV=0代码>在外部循环之外声明。因此,它将被所有线程共享。因此,在EV=myEVFunc()处将有一个竞争条件代码>和每次访问EV
解决方法是在循环中声明它。这将使它对每个线程都是私有的
#pragma omp parallel for
for(short a1 = 1; a1 <= 6; ++a1)
{
++myArray[a1-1];
if(....)
{
--myArray[a1-1];
continue;
}
double EV = myEVFunc();
if(EV...)
...
#pragma omp parallel for
对于(短a1=1;a1,如果您需要的更多,您还可以使用线程私有
它将为每个线程提供变量EV的私有副本。最初,除非您也使用copyin,否则它将在这些线程中取消初始化
如果指令中没有COPYOUT,则如下所示:
#pragma omp parallel for private(EV)
这避免了竞争条件,并允许EV在每个线程中独立运行您还具有阵列访问的竞争条件,例如++myArray[a1-1];
和来自不同线程的++myArray[a2-1];
。
另外,您需要声明所有循环计数器私有,a1
(由于pragma omp for而默认为私有,a2、a3
)
也许您可以找到另一种编写循环的方法,因为循环中的所有这些条件语句通常都不是很有效。您可以使用“#pragma omp atomic”来编写++和--语句。