AVX 내장 함수를 사용하여 일부 코드를 최적화하려고합니다. 매우 간단한 테스트 케이스가 컴파일되지만 내 루프가 내가 이해할 수없는 여러 가지 이유 때문에 벡터화되지 않았다고합니다.왜이 C 벡터 루프는 자동 벡터화되지 않습니까?
이이 명령 줄입니다
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <immintrin.h>
int main(void)
{
__m256 * x = (__m256 *) calloc(1024,sizeof(__m256));
for (int j=0;j<32;j++)
x[j] = _mm256_set1_ps(1.);
return(0);
}
전체 프로그램 simple.c입니다 : GCC simple.c -O1 -fopenmp -ffast - 수학 -lm -mavx2 -ftree - 벡터 라이 -fopt- 정보-VEC-놓친 이것은 출력
을 :
- simple.c : 11 : 3 : 참고 : 벡터화하지 : 지원되지 않는 데이터 유형
- simple.c : 11 : 3 : 참고 : 벡터화 요소를 결정할 수 없습니다.
- simple.c : 6 : 5 : 참고 : 벡터화되지 않음 : 기본 블록에 데이터가 충분하지 않습니다.
- simple.c : 11 : 3 : 참고 : 벡터화되지 않음 : 기본 블록에서 데이터가 충분하지 않습니다.
- simple.c : 6 : 5 : 참고 : 벡터화되지 않음 : 기본 블록에 데이터가 충분하지 않습니다.
- simple.c : 6 : 5 : 참고 : 벡터화되지 않음 : 기본 블록에 데이터가 충분하지 않습니다.
나는 GCC 버전 5.4 있습니다.
사람이 메시지를 해석하고 무슨 일이 일어나고 있는지 이해하는 데 도움이 수 있습니까?
자동 벡터화와 관련하여 GCC의 정보와 경고를 설명하는 유용하고 자세한 설명서가 있습니까? 때때로 출력이 혼란 스럽다는 것을 알게되었습니다. – Jens
@Jens : 잘 모르겠다. 필자는 컴파일러가 무엇을했는지보기 위해 항상 asm 출력을 보았습니다. 복잡한 함수에서 디버거의 단일 스테핑은 주 루프 (껍질을 벗긴 프롤로그/에필로그 정렬되지 않은 반복의 노이즈 중에서)를 찾는 데 도움이 될 수 있습니다. –
피터에게 감사드립니다. 나는이 메시지가 뭔가 잘못되었다고 암시한다고 생각했다. 지금까지의 답변과 경험으로는 asm에 대한 친숙 함을 대체 할만한 것이 없다는 것을 알 수 있습니다. 나중에 알기보다는 이것을 더 빨리 알게됩니다. – ghostofsandy