2011-03-09 4 views
0

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

A_me2은 포인터의 배열이기 때문에 컴파일러는 A_me2[0]A_me2[1]이 겹치지 않는다는 것을 알지 못하므로 올바르게 정렬해야하는 동일한 위치에 여러 번 쓰기가 발생합니다. 컴파일러에게 의존성이 없다고 가정하여 컴파일러에게 자동 안전 메커니즘을 무시하도록 지시하는 컴파일러 #pragma이 종종 있습니다.

+0

pragmas에 대해 확실하지 않지만 컴파일러가 포인터가 겹치지 않는다는 것을 알리는 데 사용되는 restrict 키워드가 아닙니까? 또한 당신이 말하는 것이 정확하다면 왜 다음 코드가 예상대로 병렬화됩니까? – FreaknBigPanda

+0

@FreaknBigPanda : 거기에'restrict'를 두는 것을 잊었습니다. 그게 효과가있다. –

+0

@FreaknBigPanda : 이것은 스칼라의 1 차원 배열이며, 컴파일러는 배열의 다른 스칼라가 겹치지 않는다는 것을 알고 있습니다. 동일한 요소를 덮어 쓰면 좋습니다. 초기 코드의 문제는 예측할 수없는 (컴파일러에) 같은 요소를 덮어 쓰지 않을 수도 있다는 것입니다. –

관련 문제