2013-05-16 2 views
0

연타 당신이 일류 시민으로서의 벡터 값을 처리 할 수있는하는 C/C++ 확장이 있습니다Mac OS X에서 벡터를 참조 또는 값으로 전달하는 것이 더 효율적입니까?

typedef double double4 __attribute__((ext_vector_type(4)); 
// easy assignment 
double4 a = {1, 2, 3, 4}; 
double4 b = {4, 3, 2, 1}; 
// basic operators work component-wise 
double4 c = a + b; // {5, 5, 5, 5} 
// you can even swizzle elements! 
double4 d = a.zyxw; // {3, 2, 1, 4} 

이 벡터 SSE 인텔 맥에 기본 플랫폼의 SIMD 명령어를 사용 (만드는 것이 내가 믿는 것, NEON on ARM). 그러나, Mac OS 호출 규칙이 벡터 유형을 다루는 방법에 대해서는 너무 확신 할 수 없습니다.

참조 또는 복사본으로 벡터를 전달하는 것이 더 효율적입니까? 그 차이는 크지 않을 수도 있지만 많은 벡터 주위를 지나갈 것이므로 가능한 한 빨리 올바른 습관을 고를 수있을 것이라고 생각했습니다.

+0

SSE 레지스터는 128 비트 폭이지만 'double4'는 256 비트 폭입니다. –

+0

@DietrichEpp, AVX가 256 비트'ymm0' -ymym15' 레지스터를 가져 왔다는 것을 이해할 수 있습니다. ('xmm'은 이제 이들 중 하위 128 비트를 나타냅니다.) – zneak

+1

AVX는 기본적으로 활성화되어 있지 않습니다. –

답변

1

빠른 테스트에 따르면 double4double4 인수가 스택에 전달되었지만 xmm0 및 xmm1 레지스터에 반환됩니다. 이것은 좀 이상합니다. 반면에 float4 인수는 xmm0에서 xmm7까지의 레지스터에 전달되고 xmm0에서 반환되는 결과는 예상대로입니다.

Apple은 System V Application Binary Interface를 사용합니다. AMD64 아키텍처 프로세서 보조. Mac OS X 용. 해당 문서를 올바르게 해석하면 모든 것이 레지스터에 전달되어야합니다. 나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다. 어쩌면이 작업이 아직 진행 중이며 앞으로 변경 될 수 있습니까? 그렇게하면 이전 및 새로운 동작을 혼합하려고 할 때 프로그램이 중단 될 수 있습니다.

성능을 위해 clang을 사용하여 값 당 벡터를 전달하는 것은 문제가되지 않습니다. 귀하의 기능이 극단적으로 짧지 않다면, 눈에 띄는 차이가 없어야합니다. 매우 작은 함수를 사용하는 경우 컴파일러에서 인라인하도록 (예 : static을 선언하여) 시도해야합니다.

편집 : AVX 확장과 관련된 : 컴파일러에서는 인수에 ymm0 - ymm7 레지스터를 사용하고 결과에는 ymm0을 사용합니다. 이 경우 double4는 xmm 레지스터 쌍 대신에 단일 ymm 레지스터를 차지합니다.

+0

어떻게 그걸'xmm0'에 반환 할 수 있습니까? 필요한 너비의 절반입니다. – zneak

+0

@zneak float4는 128 비트이고 xmm0에 맞습니다. double4는 256 비트이며 레지스터 쌍 xmm0 및 xmm1 (축약 xmm0/1)에 반환됩니다. –