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 결과를 섞어서 꽤 오랜 시간을 보냈지 만 지금까지 성공하지 못했습니다. 내가 놓칠지도 모르는 것에 대한 힌트를 주시면 고맙겠습니다. (코드를 벡터화하는 것이 처음이에요.
, 감사합니다스티븐
나는 이미 이것을 시도했지만 (-O2 대신 -03을 사용 했음) 맹세 했었지만 최적화 발언을 얻지 못해서 벡터화를 볼 수 없었습니다. 그러나 다시 돌아와서 귀하의 제안을 따르십시오. 스칼라 진화가 분명히 그렇지 않을 때 실행되고 있다고 나는 왜 추측하고 있었는지 모르겠습니다. 감사! – largactyl