카테고리 없음

[C ++] C / C ++에서 포인터 앨리어싱 문제를 감지하는 도구

행복을전해요 2021. 1. 12. 17:47

나는 "100 %"범위를 제공하는 어떤 것도 모르지만 (앨리어싱이 종종 방지하는) 코드를 벡터화하려면 -ftree-vectorizer-verbose=n옵션을 사용하십시오 . 여기서 n은 1과 6 사이의 정수입니다. 이것은 루프가 왜 불가능한지 몇 가지 정보를 출력합니다. 벡터화됩니다.

예를 들어 g ++ 4.1에서는 코드

//#define RSTR __restrict__
#define RSTR

void addvec(float* RSTR a, float* b, int n)
{
  for (int i = 0; i < n; i++)
      a[i] = a[i] + b[i];
      }
      

결과

$ g ++ -ftree-vectorizer-verbose = 1 -ftree-vectorize -O3 -c aliastest.cpp

aliastest.cpp : 6 : 참고 : 함수에서 0 개의 루프를 벡터화했습니다.

이제 RSTR에 대한 다른 정의로 ​​전환하면

$ g ++ -ftree-vectorizer-verbose = 1 -ftree-vectorize -O3 -c aliastest.cpp

aliastest.cpp : 6 : 참고 : LOOP VECTORIZED.
aliastest.cpp : 6 : 참고 : 함수에서 1 개의 루프를 벡터화했습니다.

흥미롭게도 g ++ 4.4로 전환하면 버전 관리 및 런타임 검사를 통해 첫 번째 비제 한 사례를 벡터화 할 수 있습니다.

$ g ++ 44 -ftree-vectorizer-verbose = 1 -O3 -c aliastest.cpp

aliastest.cpp : 6 : 참고 : 별칭 검사를 위해 1 개의 버전 관리를 생성했습니다.

aliastest.cpp : 6 : 참고 : LOOP VECTORIZED.
aliastest.cpp : 4 : 참고 : 함수에서 1 개의 루프를 벡터화했습니다.

그리고 이것은 RSTR 정의 모두에 대해 수행됩니다.

-------------------

과거에는 프로파일 러의 도움을 받아 속도 저하를 알리는 사례를 추적했습니다. 일부 게임 콘솔 프로파일 러는 로드-히트-스토어 페널티를 많이 일으키는 코드 부분을 강조 표시 합니다. 이는 컴파일러가 일부 포인터가 앨리어싱되어 추가로드 명령을 생성해야한다고 가정하기 때문에 종종 발생할 수 있습니다. 코드에서 발생하는 부분을 알고 나면 어셈블리에서 소스로 역 추적하여 별칭으로 간주 될 수있는 항목을 확인하고 필요에 따라 "restict"를 추가 할 수 있습니다 (또는 추가로드를 피하기위한 다른 트릭).

그러나이 수준의 세부 정보를 얻을 수있는 무료 프로파일 러가 있는지는 잘 모르겠습니다.

이 접근 방식의 부수적 인 이점은 실제로 코드 속도를 늦추는 사례를 조사하는 데 시간을 소비한다는 것입니다.



출처
https://stackoverflow.com/questions/2006163