2016-07-28 5 views
3

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 있습니다.

사람이 메시지를 해석하고 무슨 일이 일어나고 있는지 이해하는 데 도움이 수 있습니까?

답변

3

이미 수동으로 내장 함수와 벡터화하고, 그래서 자동 벡터화 GCC를 위해 왼쪽 아무것도 없다. 이것은 흥미롭지 않은 경고로 이어지고, 내장 또는 루프 카운터 증분을 자동 벡터 라이팅하려는 것으로 가정합니다.

나는 gcc 5.3 (on the Godbolt compiler explorer)에서 좋은 asm을 얻는다. 어리석은 짓을하지 않으면 최적화를 할 수있는 함수를 작성하거나 -O1 만 컴파일하면된다.

#include <immintrin.h> 

void set_to_1(__m256 * x) { 
    for (int j=0;j<32;j++) 
    x[j] = _mm256_set1_ps(1.); 
} 

    push rbp 
    lea  rax, [rdi+1024] 
    vmovaps ymm0, YMMWORD PTR .LC0[rip] 
    mov  rbp, rsp 
    push r10      # gcc is weird with r10 in functions with ymm vectors 
.L2:         # this is the vector loop 
    vmovaps YMMWORD PTR [rdi], ymm0 
    add  rdi, 32 
    cmp  rdi, rax 
    jne  .L2 
    vzeroupper 
    pop  r10 
    pop  rbp 
    ret 

.LC0: 
    .long 1065353216 
    ... repeated several times because gcc failed to use a vbroadcastss load or generate the constant on the fly 

사실 -O1에서 거의 같은 ASM을 얻을 수 있지만, 일을 멀리 최적화하지 -O1을 사용하는 것은 할 정말 무슨 GCC 볼 수있는 좋은 방법이 아니다 않습니다.

+0

자동 벡터화와 관련하여 GCC의 정보와 경고를 설명하는 유용하고 자세한 설명서가 있습니까? 때때로 출력이 혼란 스럽다는 것을 알게되었습니다. – Jens

+0

@Jens : 잘 모르겠다. 필자는 컴파일러가 무엇을했는지보기 위해 항상 asm 출력을 보았습니다. 복잡한 함수에서 디버거의 단일 스테핑은 주 루프 (껍질을 벗긴 프롤로그/에필로그 정렬되지 않은 반복의 노이즈 중에서)를 찾는 데 도움이 될 수 있습니다. –

+0

피터에게 감사드립니다. 나는이 메시지가 뭔가 잘못되었다고 암시한다고 생각했다. 지금까지의 답변과 경험으로는 asm에 대한 친숙 함을 대체 할만한 것이 없다는 것을 알 수 있습니다. 나중에 알기보다는 이것을 더 빨리 알게됩니다. – ghostofsandy