문제

내가 이해할 수 있는 이에 대한 요구 사항의 오래된 PPC RISC 시스템 및 x86-64 지만,오래 된도 86?이 경우,스택해야에 정렬 4 경계 바이트다.Yes,일부 의 MMX/SSE 지침을 필요로 16byte 정렬하지만,경우에는 요구 사항의 수신자,그 다음은 지켜야 한다는 선형이 올바른 것입니다.왜 부담이 발신자 이 여분의 필요조건입니까?이 실제로 발생할 수 있습니다 몇 가지 성능 저하기 때문에 모든 호출 사이트를 관리해야 합니다.나는 뭔가?

업데이트: 후에 좀 더 많은 조사로부와 상담 내부 동료들,나는 몇 가지 이론들에 대해 이:

  1. 일관성 사 PPC,x86 및 x64 버전 OS
  2. 그것은 보인다는 GCC 코드 생성 일관적으로는 하위 esp xxx 다음"mov"s 의 데이터 스택에 보다는 오히려 단순히 일을"밀어"명령입니다.이 수 실제로 더 빠르게 일 하드웨어입니다.
  3. 이 있지만 복잡하게 호출 사이트는 작은,아주 작은 추가의 오버헤드를 사용할 때 기본"cdecl"규칙을 어디자 정리합니다.

문제를 내가 마지막 항목은 전화에 대 한 규칙에 의존하는 수신자가 청소 스택,위의 요구 사항 "uglifies 는"코드 생성.예를 들어,어떤 컴파일러 구현하기로 결정은 더 빠른 등록 기반을 호출하는 스타일에 대한 자신의 내부 사용을(즉,어떤되지 않는 코드가 호출되는 용도에서 다른 언어로 또는 소스)?이 스택 정렬 것이 취소될 수 있습니다 몇 가지 성과의 이익을 달성하여 전달하는 매개변수에 등록합니다.

업데이트: 그래서 지금까지의 유일한 실제 응용 일관성,하지만 나에게는 너무 쉽게의 대답이다.나는 잘 20 년 이상의 경험으로 86 건축과하는 경우 일관성,성능,또는 다른 뭔가가 구체적,정말 이유는 그때 나는 정중하는 것이 좋은 순진하는 개발자 필요합니다.그들을 무시하고 거의 세 가지 수십 년 동안의 도구와 지원합니다.는 경우에 특히 늘어날 것으로 예상하고 도구 공급 업체를 빠르고 쉽게 적응을 위한 도구 그들의 플랫폼(아마...그 Apple...)하지 않고 점프를 통해 여러 가지로 겉으로는 불필요한 농구.

나는 이 항목에서 다른 일도한 다음 닫습니다...

관련

도움이 되었습니까?

해결책

"Intel®64 및 IA-32 아키텍처 최적화 참조 설명서"에서 섹션 4.4.2 :

"최상의 성능을 위해 스트리밍 SIMD 확장 및 스트리밍 SIMD 확장 2는 메모리 오페라를 16 바이트 경계에 정렬해야합니다. 정렬되지 않은 데이터는 정렬 된 데이터에 비해 상당한 성능 처벌을 유발할 수 있습니다."

부록 D :

"함수 __M128 데이터, 매개 변수 및 XMM 레지스터 유출 위치를 함수 호출 전체에 정렬하기 위해 스택 프레임이 기능 입력시 16 바이트 경계에 정렬되도록하는 것이 중요합니다."

http://www.intel.com/assets/pdf/manual/248966.pdf

다른 팁

나는 확실하지 않은 먼저 손을 증거,하지만 난 그 이유는 SSE.SSE 은 훨씬 더 빠른 경우에 당신의 버퍼를 이미 정렬에서는 16 바이트의 경계(movps 대 movups),그리고 모든 86 최소 sse2mac os x.그것은 처리 될 수 있습 응용 프로그램에 의해 사용자,그러나 비용은 매우 중요합니다.면 전반적인 비용에 그것을 만들기 위한 필수 아비도 중요한 수있다,가치가있다.SSE 은 아주 사용되는 퍼지에서 mac os X:가속 framework,etc....

나는 그것이 X86-64 ABI와 함께 인라인을 유지하는 것이라고 생각합니다.

첫째,주는 16 바이트의 정렬은 예외 도입하여 애플 시스템 V IA-32ABI.

스 맞춤만할 때 필요한 시스템 호출 하는 기능 때문에,많은 시스템 라이브러리를 사용하여 SSE 또는 Altivec 확장자를 필요로 하는 16 바이트의 정렬.내가 찾는 명확한 기준에서 libgmalloc 남자 페이지.

할 수 있습이 완벽하게 처리하는 스택 구조에게 당신이 원하는 방식으로,하지만 당신을 호출하려고 시스템을 기능으로 정렬,스택은 당신으로 끝날 것이다 misaligned_stack_error 메시지입니다.

편집: 에 대한 기록,제거할 수 있는 맞춤 문제를 컴파일할 때는 GCC 를 사용하여 mstack-재편성 옵션입니다.

이것은 효율성 문제입니다.

새로운 SSE 명령어를 사용하는 모든 기능에서 스택이 16 바이트 정렬되도록하는 것은 해당 명령을 사용하여 많은 오버 헤드를 추가하여 성능을 효과적으로 줄입니다.

반면에 스택을 16 바이트를 항상 정렬하면 성능 페널티없이 SSE 명령어를 자유롭게 사용할 수 있습니다. 이것에 대한 비용은 없습니다 (최소한 지침으로 측정 된 비용). 그것은 함수의 프롤로그에서 일정한 변화를 포함합니다.

스택 공간을 낭비하는 것은 저렴합니다. 아마도 캐시의 가장 뜨거운 부분 일 것입니다.

내 생각에 Apple은 모든 사람이 스택을 정렬하는 Xcode (GCC)를 사용한다고 생각합니다. 따라서 커널이 필요하지 않도록 스택을 정렬 해야하는 것은 마이크로 최적화 일뿐입니다.

왜 그런지에 대한 질문에 대답 할 수는 없지만 다음 사이트의 매뉴얼이 유용 할 수 있습니다.

http://www.agner.org/optimize/

ABI와 관련하여 특히 다음을 살펴보십시오.

http://www.agner.org/optimize/calling_conventions.pdf

그것이 유용하기를 바랍니다.

흠, Os X Abi도 레지스터에 작은 구획을 통과하는 것과 같은 재미있는 RISC를하지 않았습니까?

그래서 다른 플랫폼 이론과의 일관성을 가리 킵니다.

그것을 생각해보십시오. Freebsd Syscall API는 64 비트 값을 정렬합니다. (예 : Lseek 및 MMAP와 같은)

커널에서 일관성을 유지하기 위해. 이를 통해 동일한 커널을 수정없이 여러 아키텍처에서 부팅 할 수 있습니다.

레거시 PowerPC 기반 플랫폼에서 쉽게 휴대 할 가능성을 고려한 이유가 확실하지 않습니까?

이것을 읽으십시오 :

http://developer.apple.com/library/mac/#documentation/developertools/conceptual/lowlevelabi/100-32-bit_powerpc_function_calling_calling_calling_calling_calventions/32bitpowerpc.html#//apple_ref/doc/uid/tp40002438-sw20

그런 다음 "32 비트 PowerPC 함수 호출 규칙"과 마지막으로 확대되었습니다.

"이것은 32 비트 PowerPC 환경에서 사용할 수있는 임베딩 정렬 모드입니다.

전력 정렬 모드는 AIX 운영 체제에 IBM XLC 컴파일러가 사용하는 정렬 규칙에서 파생됩니다. AIX 및 Mac OS X에서 사용되는 GCC의 PowerPC-Ararchitecture 버전의 기본 정렬 모드입니다.이 모드는 다른 공급 업체의 PowerPC-Ararchitecture 컴파일러간에 호환 될 가능성이 높기 때문에 일반적으로 공유되는 데이터 구조와 함께 사용됩니다. 다른 프로그램. "

레거시 PowerPC 기반 OSX 배경을 고려할 때, 이식성은 주요 고려 사항입니다. 컨벤션에 따라 AIX의 XLC 컴파일러로 돌아갑니다. 모든 도구와 응용 프로그램이 최소한의 재 작업과 함께 작동 할 필요가 있다고 생각할 때 가능한 한 동일한 레거시 ABI를 고수하는 것이 중요하다고 생각합니다.

그것은 철학을 제공하고 더 읽기는 명시 적으로 언급 된 규칙입니다 ( "Prolog and epilog").

호출 된 함수는 자체 스택 프레임을 할당하여 스택에 16 바이트 정렬을 보존해야합니다. 이 작업은 컴파일러가 서브 루틴의 본문 앞에 놓는 프롤로그 (Prolog)라는 코드 섹션에 의해 달성됩니다. 서브 루틴 본체 후, 컴파일러는에 필로그를 배치하여 프로세서를 서브 루틴 호출 이전의 상태로 복원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top