프로그램에서 별칭 분석을 수행하고 잠재적 인 포인터 별칭 때문에 gcc/g ++에서 차선의 명령 시퀀스를 생성해야하는 위치를 알려주는 도구가 있습니까?C/C++에서 포인터 에일리어싱 문제를 감지하는 도구
답변
"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 정의가 이루어집니다.
여러 가지 다른 예제를 시도했지만 실제로 도움이되지 않았습니다. 예를 들어, 나는'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 루프가 벡터화되었습니다. ' –
@ 로버트 자세한 정보가 필요하면 자세한 정보 수준을 높일 수 있습니다. 또는 -fdump-tree-alias를 사용하여 컴파일러가 별칭 분석에 대해 생각하는 것을 확인할 수 있습니다. 또는 전체 떡방울에 대해 - fdump-tree-all. 예를 들어, 인용 부호를 사용하면 "no vectype for stmt :"메시지가 표시됩니다. 이는 하드웨어가 적합한 벡터 유형을 지원하지 않는다는 것을 의미합니다. 제한 질문 중 하나에 대한 응답에서 언급 한 것처럼 해결책은 -march = pentium-m 및 -mfpmath = sse를 지정하는 것입니다.이 예제에서는 주 루프가 벡터화되거나 제한 될 수 없으므로이 예제에는 도움이되지 않습니다. – janneb
이전에는 프로파일 러의 도움을 받아 속도 저하를 알리는 사례를 추적했습니다. 게임 콘솔 프로파일 러 중 일부는 load-hit-store penalties을 많이 발생시키는 코드 부분을 강조 표시합니다. 컴파일러에서 일부 포인터에 별칭이 있다고 가정하고 추가로드 지침을 생성해야하기 때문에 이러한 오류가 자주 발생할 수 있습니다. 발생하는 코드의 일부를 알게되면 어셈블리에서 소스로 되돌아 가서 별칭으로 간주 될 수있는 것을 확인하고 필요에 따라 "restict"를 추가 할 수 있습니다 (또는 추가로드를 피하기위한 다른 트릭).
자유롭게 사용할 수있는 프로파일 러가 있는지 여부는 확실하지 않지만이 세부 정보 수준에 들어갈 수 있습니다.
이 접근법의 장점은 실제로 코드를 느리게하는 경우를 검사하는 데만 시간을 소비한다는 것입니다.
- 1. 동시성 문제를 감지하는 도구
- 2. solr 성능 문제를 찾는 도구
- 3. UINavigationController 도구 모음의 백그라운드에서 터치를 감지하는 방법
- 4. 적절한 시간 내에 메모리 누수를 감지하는 도구
- 5. 국제화 문제를 탐지하는 정적 분석 도구
- 6. Visual Studio 2010에서 ThreadPool 문제를 디버깅하기위한 도구
- 7. Interop 문제를 디버그하는 데 유용한 최상의 도구
- 8. 포인터 문제에 대한 포인터
- 9. 포인터 연산 후 포인터 해제
- 10. 도구 (의 StringBuilder를 사용한다) String.Concat의 사용/남용을 감지하는
- 11. PHP 응용 프로그램에서 테이블 종속성을 감지하는 정적 분석 도구
- 12. 포인터 포인터 메모리 할당에 대한 포인터
- 13. MIPS 어셈블리 포인터 포인터?
- 14. C 포인터 포인터 질문
- 15. 모든 컴퓨터 하드웨어를 검사하여 문제를 일으키는 도구 또는 소프트웨어가 있습니까?
- 16. C#의 잠재적 인 캐스팅 문제를 조사하는 도구
- 17. Ninject와 함께 Entity Framework 캐싱 문제를 사용하는 MVC3 도구
- 18. 포인터
- 19. 포인터
- 20. 포인터
- 21. 포인터
- 22. 포인터
- 23. 포인터
- 24. 포인터 대 초기화되지 않은 포인터
- 25. C++, SQLite - 문자열 포인터 포인터
- 26. iPhone 메모리 누수 도구
- 27. 클래스 내의 "this"포인터
- 28. 배열에 포인터 배열 할당
- 29. C++의 멤버 연산자에 대한 포인터 포인터
- 30. 포인터 (* argv [])의 포인터에 대한 포인터 산술?
인간의 두뇌? 어쨌든 성능이 중요한 영역에만 관심이있을 것입니다 ..... –
"차선책"이란 무엇입니까? 이 용어는 잘 알려진 최적의 명령어 순서가 있다고 가정합니다. 나는 그것을 일반적으로 볼 수 없다. – MSalters
@Mitch Wheat : 누군가가 나에게 익숙하지 않은 50,000 라인짜리 프로그램을 나눠주고 "Optimize This"라고 말한다면? –