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

时间:2011-03-09 02:37:31

标签: 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;
    }
}

然而,当我在编译器中运行此循环时,我收到一条消息:“不并行化,不安全依赖”。究竟哪里有不安全依赖?两个赋值语句的输入和输出之间显然没有别名,并且i和j对于每个线程都是私有的...我非常难以理解为什么会发生这种情况。任何指导将不胜感激!

1 个答案:

答案 0 :(得分:1)

由于A_me2是一个指针数组,编译器不知道(例如)A_me2[0]A_me2[1]不重叠,导致多次写入同一位置需要正确订购。通常有一个编译器#pragma会告诉编译器假设没有依赖关系,这会覆盖自动安全机制。