2012-03-10 3 views
0

나는 C (2 차원 푸 아송 솔버)로 프로그램을 작성하고 open 루프를 사용하여 큰 for 루프를 가속화했다. 내가 관찰 한 것은 OpenMP 병렬 블록 내부에서 #pragma always vector 지시문을 포함하는 경우에도 for 루프가 벡터화되지 않는다는 것입니다. 컴파일을 위해 나는 pathscale 컴파일러를 사용하고있다.OpenMP에서 루프의 벡터화

내가 벡터화하고자하는 코드는 다음과 같습니다

#pragma omp parallel shared(in, out, lambda,dim,C) private(k) 
    { 
      #pragma omp for schedule(guided,dim/nthreads) nowait 
      for(k = 0;k < dim; k++){ 
        in[k] = C*out[k]*lambda[k]; 
      } 
    } 

는 곳을, 람다와의 이중 정밀도 배열입니다.

하지만 난 항상을 벡터 의 #pragma을 포함 할 경우에도, 어떤 컴파일러 답변하는 것은 : 당신은 이것에 대한 어떤 해결 방법이있는 경우

warning: ignoring #pragma always vector 

알고 계십니까?

감사합니다.

+2

나는 그 루프를 벡터화/병렬 처리하는 것으로부터 많은 것을 얻지 못할 것이라고 생각합니다. 많은 메모리 액세스를위한 작업이 거의 없습니다. – Mysticial

+0

@ 신비로운, 이것은 경연을위한 입장의 일부분이고 도움 받았다. :) – Konstantinos

답변

3

the User Guide for the PathScale compiler을 살펴본 결과 #pragma always도 아니고 #pragma vector도 찾지 못했습니다. 그래서 컴파일러가이 pragma를 인식하지 못한다고 알려주고 무시합니다. 사용자 코드의

벡터화 ... 활성화 또는 내부 루프의 벡터화를 비활성화 플래그 -LNO:simd[=(0|1|2)]에 의해 제어됩니다

그러나 7.4.5에서 나는 벡터화 당신을 도움이 다음과 같은 옵션을 발견했다. 0은 벡터 라이저를 끄고 1 (기본값)은 최적이 아닌 정렬로 인해 성능에 영향을주지 않는다고 판단 할 수있는 경우에만 컴파일러를 벡터화하고 2는 제약없이 벡터화합니다 (가장 적극적입니다).

-LNO:simd_verbose=ON은 벡터화 정보 (사용자 코드 벡터화에서)를 표준 출력으로 인쇄합니다. always은 프라그에 대한 하나 개의 가능한 매개 변수 인 상태, Intel's compiler has #pragma vector 보조 노트로

은 (당신이 #pragma always vector에서 걸릴 수있는 곳 추측). 그러나 pragma는 일반적으로 여러 공급 업체에서 지원하는 몇 가지 확장 (OpenMP 중 하나)을 제외하고는 컴파일러 관련입니다.

+0

감사합니다 알렉세이. 나는 방금 그것을 나 자신을 발견하고 그것을 시도했다. 그러나 신비로 웠던 것처럼, 일은 충분하지 않다. 그것이 그 차이의 많은 것을 만드는 것처럼 보인다. – Konstantinos