我有以下代码:
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来并行化循环。当我放置时,代码编译得很好
在最外面的for循环前面#pragma omp parallel for
。但是它给出了错误的结果。我怀疑循环中的continue语句和嵌套循环中存在共享变量这两个问题。
是否可以将OpenMP与此代码段一起使用,如果是这样,任何人都可以请给我正确的语法。提前谢谢。
答案 0 :(得分:2)
我会指出一些显而易见的事情:
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...)
...
2.)另一个(sorta)问题是你的外环只有6次迭代。所以你不会超过6个线程。此外,您可以通过4核心来解决负载平衡问题......
答案 1 :(得分:1)
如果您需要更多内容,也可以使用私密线程
它将为每个线程提供变量EV的私有副本。最初它将在这些线程中未初始化,除非你也使用copyin。
没有copyin,指令看起来像:
#pragma omp parallel for private(EV)
这可以避免竞争条件,并允许EV在每个线程中独立行动
答案 2 :(得分:0)
你也有阵列访问的竞争条件,例如++myArray[a1-1];
和来自不同主题的++myArray[a2-1];
。
另外你需要声明所有循环计数器私有,a1
(由于pragma omp是默认的私有,但不是),a2, a3
..
也许你可以找到另一种编写循环的方法,因为循环中的所有这些条件语句通常都不是很有效。