Multithreading 并行化循环:不安全依赖在哪里?

Multithreading 并行化循环:不安全依赖在哪里?,multithreading,dependencies,solaris,Multithreading,Dependencies,Solaris,我正在尝试使用Solaris Studio Complier中提供的自动并行化选项并行化以下循环 int max = A->m; complex** A_me2; complex fred; for ( i = 0; i < max; i++ ) { for ( j = 0; j < i-1; j++ ) { A_me2[i][j] = fred; A_me2[i][j] = fred; } } int

我正在尝试使用Solaris Studio Complier中提供的自动并行化选项并行化以下循环

int max = A->m;
complex** A_me2;    
complex fred;   

for ( i = 0; i < max; i++ )
{
    for ( j = 0; j < i-1; j++ )
    {
        A_me2[i][j] = fred;
        A_me2[i][j] = fred;
    }
}
int max=A->m;
复杂**A_me2;
复杂弗雷德;
对于(i=0;i

然而,当我在编译器中运行这个循环时,我得到一条消息:“不是并行的,不安全的依赖”。不安全依赖到底在哪里?两个赋值语句的输入和输出之间显然没有混叠,i和j对每个线程都是私有的。。。我非常困惑为什么会发生这种情况。任何指导都将不胜感激

由于
A_-me2
是指针数组,编译器不知道(例如)A_-me2[0]
A_-me2[1]
没有重叠,导致对同一位置的多次写入需要正确排序。通常会有一个编译器
#pragma
,它会告诉编译器假设没有依赖项,从而覆盖自动安全机制。

我不确定pragma,但用于让编译器知道指针不重叠的restrict关键字不是吗?另外,如果你说的是正确的,那么为什么下面的代码会像预期的那样并行化?@FreaknBigPanda:我忘了把
restrict
放在那里;这应该行。@FreaknBigPanda:这是一个一维标量数组,编译器知道数组中的不同标量不会重叠。可以覆盖相同的元素;初始代码中的问题是,可能会或可能不会以不可预测的方式(对编译器)覆盖相同的元素。我如何将代码放入wtf中。无论如何,我尝试了restrict关键字。我将A_me2声明为complex*restrict*A_me2,但仍然没有成功。我不理解为什么向数组添加另一个维度会改变编译器对情况的解释。下面是带有仍然无法编译的限制关键字的代码: