[英]OpenMP and Nested for loops with continue statements
我有以下代码:
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();
}
}
}
}
}
我正在尝试使用OpenMP并行化循环。 当我将#pragma omp parallel for
在最外层的for循环之前时,代码编译良好。 但是,它给出了不正确的结果。 我怀疑两个问题是循环内的continue语句,以及嵌套循环中存在共享变量的事实。 是否可以在此代码段中使用OpenMP,如果可以,请给我正确的语法。 提前致谢。
我将指出一些显而易见的事情:
1.) double EV = 0;
在外部循环外部声明。 因此它将被所有线程共享。 因此,您将具有EV = myEVFunc();
的竞争条件 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...)
...
2.)另一个(排序)问题是您的外循环只有6次迭代。 这样您将不会获得超过6个线程。 此外,您可能会遇到4个核心的负载平衡问题...
如果您还需要更多,您还可以使用线程专用
它将为每个线程提供变量EV的私有副本。 最初,除非您也使用copyin,否则它将在这些线程中未初始化。
不带copyin的指令将如下所示:
#pragma omp parallel for private(EV)
这避免了竞争情况,并允许EV在每个线程中独立运行
您还可以通过数组访问获得竞争条件,例如++myArray[a1-1];
和++myArray[a2-1];
来自不同的线程。 另外,您需要声明所有循环计数器私有a1
(由于pragma omp而不是默认私有) a2, a3
是默认私有。
也许您可以找到另一种编写循环的方法,因为循环内的所有这些条件语句通常效率不高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.