我正在尝试使用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对于每个线程都是私有的...我非常难以理解为什么会发生这种情况。任何指导将不胜感激!
答案 0 :(得分:1)
由于A_me2
是一个指针数组,编译器不知道(例如)A_me2[0]
和A_me2[1]
不重叠,导致多次写入同一位置需要正确订购。通常有一个编译器#pragma
会告诉编译器假设没有依赖关系,这会覆盖自动安全机制。