2011-05-01 3 views
3
나는 GCD는 다음과 같이 사소한 예를 작동 방식을 이해

: X[a*i + b]X[c*i + d]GCD 테스트 - 루프 문 사이에 의존성을 테스트

a=2 :

for(i=1; i<=100; i++) 
{ 
     X[2*i+3] = X[2*i] + 50; 
} 

우리가 먼저 다음과 같은 형식으로 변환 , b=3, c=2, d=0GCD(a,c)=2(d-b)-3이다. 2-3을 나누지 않으므로 의존 할 수 없습니다.

그러나 이중 중첩 루프에서 어떻게이 GCD 테스트를 수행 할 수 있습니까? 예를 들어

: 중첩 된 루프의 경우 GCD을 적용 할

for (i=0; i<10; i++){ 
    for (j=0; j<10; j++){ 
     A[1+2*i + 20*j] = A[2+20*i + 2*j); 
    } 
} 

답변

2

첨자는 delinearized 수 있지만 GCD 테스트를 직접 적용하는 간단합니다. 당신의 예에서, 첨자 쌍 [1+2*i + 20*j][2+20*i + 2*j], 그래서 우리가 방정식의 정수 솔루션을

1 + 2*i + 20*j = 2 + 20*i' + 2*j' 

재정렬을 찾고, 우리가 얻을

2*i - 20*i' + 20*j - 2*j = 1 

계산 모든 계수의 GCD, 2, -20, 20, -2로 나누고 상수를 나누는 지 확인하십시오. 이 경우 GCD는 2입니다. 2는 1을 나눌 수 없기 때문에 의존성이 없습니다.

2

은 "쉬운"방법은 배열 자체가 multidemsional있는 경우에 적용하는 것입니다; 즉, 원래 소스 코드는 이미 선형화 된 표현식이 아닌 여러 개의 첨자를 사용합니다. 물론 이러한 선형화 된 첨자를 "역 변환"할 수 있다면 동등한 효과를 얻을 수 있습니다.

여러 문제를 해결 한 후에는 "치수 별 치수"GCD 테스트를 적용하기 만하면됩니다. 어떤 차원이 종속성을 나타내지 않는다면, 여러분은 멈출 수 있고 전체 다중 서열 자릿수 시퀀스에 대한 의존성이 없다고 선언 할 수 있습니다.

물론 핵심은 다차원 인덱싱 문제로 캐스팅하면 개별 인덱스 값과 해당 인덱스 표현 튜플간에 일대일 매핑이 있다는 좋은 특성이 있다는 것입니다. 이것 없이는 문제가 더 어려워진다.

이것은 ASC Fortran 벡터화 컴파일러에서 70 년대에 취한 접근법이며, 특히 비 분리형의 경우 방향성 첨자 분석과 함께 사용되는 것이 좋습니다. 자체적으로 GCD 테스트만으로는 충분하지 않지만 더 비싼 의존성 분석을 피할 수있는 경우에는 분석에서 조기 결정을 내릴 수있는 상대적으로 저렴한 방법을 제공합니다.