2010-01-05 4 views
3

프로그램에서 별칭 분석을 수행하고 잠재적 인 포인터 별칭 때문에 gcc/g ++에서 차선의 명령 시퀀스를 생성해야하는 위치를 알려주는 도구가 있습니까?C/C++에서 포인터 에일리어싱 문제를 감지하는 도구

+1

인간의 두뇌? 어쨌든 성능이 중요한 영역에만 관심이있을 것입니다 ..... –

+0

"차선책"이란 무엇입니까? 이 용어는 잘 알려진 최적의 명령어 순서가 있다고 가정합니다. 나는 그것을 일반적으로 볼 수 없다. – MSalters

+0

@Mitch Wheat : 누군가가 나에게 익숙하지 않은 50,000 라인짜리 프로그램을 나눠주고 "Optimize This"라고 말한다면? –

답변

4

"100 %"커버리지를 제공하는 것은 모르지만, 앨리어싱이 방지하는 코드를 벡터화하려면 -ftree-vectorizer-verbose=n 옵션을 사용하십시오. 여기서 n은 1과 6 사이의 정수입니다. 루프를 벡터화 할 수 없습니다. 이제

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

aliastest.cpp:6: note: vectorized 0 loops in function. 

에서 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]; 
} 

결과는 RSTR에 대한 다른 정의로 ​​전환하고 당신은, 흥미롭게도

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

aliastest.cpp:6: note: LOOP VECTORIZED. 
aliastest.cpp:6: note: vectorized 1 loops in function. 

를 얻을 수 g ++ 4.4로 전환하면 버전 지정 및 런타임 검사를 통해 첫 번째 비 제한적 경우를 벡터화 할 수 있습니다.

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

aliastest.cpp:6: note: created 1 versioning for alias checks. 

aliastest.cpp:6: note: LOOP VECTORIZED. 
aliastest.cpp:4: note: vectorized 1 loops in function. 

그리고이 두 가지 RSTR 정의가 이루어집니다.

+0

여러 가지 다른 예제를 시도했지만 실제로 도움이되지 않았습니다. 예를 들어, 나는'restrict'의 성능상의 이점을 보여주는이 프로그램에서 이것을 시도했다 : http://stackoverflow.com/questions/1965487/does-the-restrict-keyword-provide-significant-anti-aliasing-benefits-in -gcc-g/1966649 # 1966649'gcc -ftree-vectorizer-verbose = 1 -ftree-vectorize -O3 -std = c99 -DUSE_RESTRICT restrict.c -o restrict restrict.c : 15 : 참고 : 벡터화 된 0 개의 루프 기능. restrict.c : 47 : 참고 : 기능상으로 0 루프가 벡터화되었습니다. ' –

+0

@ 로버트 자세한 정보가 필요하면 자세한 정보 수준을 높일 수 있습니다. 또는 -fdump-tree-alias를 사용하여 컴파일러가 별칭 분석에 대해 생각하는 것을 확인할 수 있습니다. 또는 전체 떡방울에 대해 - fdump-tree-all. 예를 들어, 인용 부호를 사용하면 "no vectype for stmt :"메시지가 표시됩니다. 이는 하드웨어가 적합한 벡터 유형을 지원하지 않는다는 것을 의미합니다. 제한 질문 중 하나에 대한 응답에서 언급 한 것처럼 해결책은 -march = pentium-m 및 -mfpmath = sse를 지정하는 것입니다.이 예제에서는 주 루프가 벡터화되거나 제한 될 수 없으므로이 예제에는 도움이되지 않습니다. – janneb

1

이전에는 프로파일 러의 도움을 받아 속도 저하를 알리는 사례를 추적했습니다. 게임 콘솔 프로파일 러 중 일부는 load-hit-store penalties을 많이 발생시키는 코드 부분을 강조 표시합니다. 컴파일러에서 일부 포인터에 별칭이 있다고 가정하고 추가로드 지침을 생성해야하기 때문에 이러한 오류가 자주 발생할 수 있습니다. 발생하는 코드의 일부를 알게되면 어셈블리에서 소스로 되돌아 가서 별칭으로 간주 될 수있는 것을 확인하고 필요에 따라 "restict"를 추가 할 수 있습니다 (또는 추가로드를 피하기위한 다른 트릭).

자유롭게 사용할 수있는 프로파일 러가 있는지 여부는 확실하지 않지만이 세부 정보 수준에 들어갈 수 있습니다.

이 접근법의 장점은 실제로 코드를 느리게하는 경우를 검사하는 데만 시간을 소비한다는 것입니다.

관련 문제