0

LLVM의 내장 루프 벡터 라이저를 실행하는 방법을 알아 내려고하고 있습니다. 나는 매우 간단한 루프를 포함하는 작은 프로그램 (나는 stdio.h에 여전히 포함하는 이유 사용중인 결코에도 불구하고 한 지점에서 약간의 출력을했다)가 :LLVM ScalarEvolution Pass가 루프 벡터 라이저의 Exit Count를 계산할 수 없습니다.

1 #include <stdio.h> 
    2 
    3 unsigned NUM_ELS = 10000; 
    4 
    5 int main() { 
    6  int A[NUM_ELS]; 
    7 
    8 #pragma clang loop vectorize(enable) 
    9  for (int i = 0; i < NUM_ELS; ++i) { 
10   A[i] = i*2; 
11  } 
12 
13  return 0; 
14 } 

당신이 볼 수 있듯이, 그것은에서 아무것도하지 않는다 모든 유용한; 난 for 루프가 벡터화 될 필요가있다. 나는했습니다

LV: Checking a loop in "main" from loop1.bc 
LV: Loop hints: force=? width=4 unroll=0 
LV: Found a loop: for.cond 
LV: SCEV could not compute the loop exit count. 
LV: Not vectorizing: Cannot prove legality. 

: 다음

clang -emit-llvm -O0 -c loop1.c -o loop1.bc 
llvm-dis -f loop1.bc 

내가 그러나

opt -loop-vectorize -force-vector-width=4 -S -debug loop1.ll 

으로 벡터화을 적용하고있어와 LLVM 바이트 코드로 컴파일하고있어, 디버그 출력은 저에게이 있습니다 LLVM 소스에서 약간 파고 들었고 SCEV가 ScalarEvolution 패스에서 나온 것처럼 보입니다. ScalarEvolution 패스는 루프 조건에 대한 백 에지 수를 계산하는 작업 (다른 것들 중에서도)이 있습니다 (이 경우, 안돼. 착각)는 여행 횟수에서 첫 번째 여행을 뺀 값이어야합니다 (이 경우 9,999). 이 패스를 훨씬 더 큰 벤치 마크에서 실행했는데 모든 루프에서 정확히 동일한 오류가 발생하므로 루프 자체가 아닌 것으로 추측하고 있지만 충분한 정보를 제공하지는 않습니다.

이 변환을 사용하여 완전한 선택 명령의 예를 찾기 위해 문서와 Google 결과를 섞어서 꽤 오랜 시간을 보냈지 만 지금까지 성공하지 못했습니다. 내가 놓칠지도 모르는 것에 대한 힌트를 주시면 고맙겠습니다. (코드를 벡터화하는 것이 처음이에요.

, 감사합니다

스티븐

답변

0

벡터화 전에 실행해야 다른 최적화의 수에 따라 달라집니다. -O0에서 실행되지 않기 때문에 코드가 '단지'벡터화 될 것이라고 기대할 수는 없습니다.

opt cmdline에서 -loop-vectorize 앞에 ​​-O2를 추가하면 여기에 도움이됩니다 ('A'배열이 외부/사용 된 것인지 확인하십시오. 그렇지 않으면 모든 것이 최적화됩니다).

+0

나는 이미 이것을 시도했지만 (-O2 대신 -03을 사용 했음) 맹세 했었지만 최적화 발언을 얻지 못해서 벡터화를 볼 수 없었습니다. 그러나 다시 돌아와서 귀하의 제안을 따르십시오. 스칼라 진화가 분명히 그렇지 않을 때 실행되고 있다고 나는 왜 추측하고 있었는지 모르겠습니다. 감사! – largactyl