2009-08-04 4 views
19

GCC에서 -fno-strict-aliasing을 지정하여 성능이 으로 저하되는 벤치 마크가 있습니까? (또는 다른 컴파일러에서는 에 해당)?-fno-strict-aliasing의 성능 영향

+1

정확한 중복 : http://stackoverflow.com/questions/754929/strict-aliasing – GManNickG

+7

해당 토론에서 성능 번호를 찾을 수 없습니다. 일부 테스트 결과/데이터를 찾고 있습니다. 내가 뭐 놓친 거 없니? – Carlos

+0

FWIW, 승인 된 응답에 성능 번호가 없습니다. – peterchen

답변

19

다른 컴파일러가 다양한 수준의 공격성을 구현하기 때문에 컴파일러마다 많은 차이가 있습니다. GCC는 상당히 공격적입니다. 엄격한 앨리어싱을 사용하면 사람과 "명백하게"동등한 포인터 (예 : foo* a; bar * b; b = (foo*)a;)가 별칭이 될 수 없으므로 매우 공격적인 변환이 가능하지만 생각보다 심각하지는 않습니다 작성된 코드. Apple의 GCC는 기본적으로 엄격한 앨리어싱을 비활성화합니다. 반면에 LLVM은 심지어 의 엄격한 앨리어싱을 가지고 있지 않으며, 계획 중에는 다른 사람이 동등성을 판단 할 수 없을 때이를 폴백 케이스로 구현할 계획이라고합니다. 위의 예에서는 여전히 a와 b를 동일하게 판단합니다. 다른 방식으로 관계를 결정할 수 없으면 유형 기반 앨리어싱 만 사용합니다.

내 경험상 엄격한 앨리어싱의 성능에 미치는 영향은 대부분 루프 불변 코드 모션과 관련이 있습니다. 유형 정보를 사용하여 루프 내로드가 반복되는 배열의 별칭이 될 수 없음을 증명할 수 있습니다. 루프 밖으로 빠져 나간다. YMMV.

+5

LLVM의 접근 방식은 나에게 맞는 것 같습니다 – Spudd86

10

내가 경험할 수있는 것은 (PS3의 대형 프로젝트에서 이것을 테스트 한 결과, 많은 레지스터로 인해 실제로 SA에서 상당한 이점을 얻을 수있는 아키텍처이기 때문에 PowerPC는 실제로 볼 수있는 최적화가된다는 것입니다. 일반적으로 매우 지역적 (범위 현명)이고 작을 것입니다. 20MB의 실행 파일에서 .text 섹션 (= 코드) 80kb를 긁어 냈습니다. 이것은 모두 작은 범위 인 & 루프에있었습니다.

이 옵션을 사용하면 생성 된 코드가 현재보다 (1 ~ 5 % 범위로 생각하면) 약간 더 가볍고 최적화 될 수 있지만 큰 결과는 기대할 수 없습니다. 따라서 -fno-strict-aliasing을 사용하면 여러분의 성능에 큰 영향을 미치지 않을 것입니다. 즉, -fno-strict-aliasing이 필요한 코드를 갖는 것이 최선의 차선책입니다.

+1

코드 크기 == 속도이기 때문에? PS3 예제는 여기에 없으며 거기에 없습니다. 어떻게 실행 되었습니까? – Eloff

+0

더 빨리 말할 수 있습니까? 잠재적 인로드/저장이 생략된다는 점을 고려할 때 전혀 생각할 사항이 아니며, 어쨌든 메모리 바인딩 된 머신에서 작은 실행 파일이 더 바람직합니다. 그래서 그것은 여기에 있고, 또한 거기에 있습니다. – nielsj

+0

OP는 성능에 영향을 미쳤고 코드 크기 만 논의했습니다. 그럼 당신은 큰 성능 차이를 보지 못할 이유에 관해서는 사실상의 인수를 사용했습니다. 그런 다음 당신은 리눅스 커널을 "최상의 상황에 차선책"이라고 불렀다. 나는 왜 당신이 downvote를 얻었는지 알 수 있다고 생각합니다. – Eloff

5

다음은 2004 년에 실시한 연구로, http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1124&context=ecetr과 같이 코드 성능에 대한 엄격한 앨리어싱 영향에 관한 링크입니다. 그림 2.5는 3 ~ 10 %의 상대적 향상을 보여줍니다. 성능 저하의

연구원 '설명 : 어셈블리 코드를 검사에서

, 우리는 저하 레지스터 할당 알고리즘의 효과가 있음을 발견했다. GCC는 그래프 채색 레지스터 할당 자 [2, 3]를 구현합니다. 엄격한 앨리어싱을 사용하면 변수의 라이브 범위가 길어지고 레지스터가 높고 누수가 발생합니다. 보다 보수적 인 앨리어싱 (aliasing)을 사용하면 같은 변수가 짧은 라이브 범위의 끝에 메모리 전송을 초래합니다.

[2] Peter Bergner, Peter Dahl, David Engebretsen 및 Matthew T. O'Keefe. 누출 코드 간섭 영역 누출을 통한 최소화. SIGPLAN Programming on Programming 언어 디자인 및 구현, 287-295, 1997.

[3] Preston Briggs, Keith D. Cooper 및 Linda Torczon. 그래프 채색 향상 기능 레지스터 할당. 프로그래밍 언어 및 시스템에 대한 ACM 트랜잭션, 16 (3) : 428-455, 1994 년 5 월.

+0

엄격한 앨리어싱 *에 의해 허용되는 최적화의 가치를 살펴본 연구는'restrict' 한정자 *를 통해 얻을 수 없었습니다. – supercat

+0

이러한 요구 사항을 충족시키는 최적화에 대해 알고 있습니까? – SzymonPajzert

+0

'restrict' 한정자는 정적 지속 기간 오브젝트가 별명을 지정하지 않는다는 것을 컴파일러에 알리는 데 효과적으로 사용할 수 없으며 경우에 따라 프로그램이 서로 별명을 지정할 수있는 동일한 유형에 대해 여러 개의 관련 포인터를 가질 수 있습니다. 유형 기반 앨리어싱은 그렇지 않은 경우에는 최적화를 허용합니다. IMHO의 경우, 더 나은 한정어를 추가하면 더 잘 처리 될 수 있습니다 (예 : 객체가 외부 코드에 노출 될 수있는 경우 'register'한정자 허용). 포인터를 통해 액세스 할 때와 달리 액세스 할 때 새 주소를 얻는 것처럼 동작 할 수 있습니다). – supercat