2014-12-15 2 views
1

값 또는 참조로 SSE 벡터를 전달하는 것이 더 효율적입니까?값 또는 참조로 v4sf 전달

typedef float v4sf __attribute__ ((vector_size(16))); 

//Pass by reference 
void doStuff(v4sf& foo); 

//Pass by value 
v4sf doStuff(v4sf foo); 

한편, v4sf는 큰 16 바이트입니다. 그러나 이러한 것들을 단일 요소 데이터처럼 처리 할 수 ​​있으며 참조는 한 단계의 간접 참조를 도입 할 수 있습니다.

+1

정적 인라인 v4sf doStuff (v4sf const & foo)'를 사용합니다. –

답변

2

일반적으로 벡터 매개 변수를 사용하는 SIMD 함수는 상대적으로 작고 성능이 중요합니다. 인라인된다. 일단 인라인되면 컴파일러가 불필요한 복사본이나 역 참조를 최적화하기 때문에 값, 포인터 또는 참조를 전달하는지 여부는 중요하지 않습니다.

또 하나의 요점 : 코드를 Windows로 이식해야 할 필요가 있다고 생각되는 경우, 전달할 수있는 벡터 매개 변수의 수를 제한하는 몇 가지 기본 ABI 제한이 있으므로 참조를 거의 사용하려고합니다.) 함수가 인라인 된 경우에도 마찬가지입니다.

+1

MSVC에서 const 참조 (예 :'v4sf doStuff (v4sf const & foo)')를 사용하는 것이 좋습니다. 그렇지 않으면 오류 C2719 : __declspec (formal ('16 '))가있는 형식 매개 변수가 정렬되지 않습니다. ". –

+1

MSVC가 수 백 번 호출 될 때 사소한 기능을 인라인하지 못한다는 사실을 발견했습니다. '__forceinline'만이 그것을 행동하게 만듭니다. – Mysticial

+0

실제로 매크로를 사용하는 것이 좋습니다. MSVC에서는'__forceinline'으로, gcc * 등에서는'__attribute__ ((always_inline))'로 확장되는'FORCE_INLINE'을 사용합니다. –