카테고리 없음
[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