2014-04-30 2 views
1

저는 SIMD으로 새롭기 때문에 F32vec4과 같은 벡터 클래스를 사용하여 병렬로 배열을 조작하는 방법을 이해하는 데 어려움이 있습니다.벡터 클래스를 사용하여 C++ 코드를 벡터화하는 방법

#include "fvec.h" 

void add(float *a, float *b, float *c)  
{ 
    F32vec4 *av=(F32vec4 *) a; 
    F32vec4 *bv=(F32vec4 *) b; 
    F32vec4 *cv=(F32vec4 *) c; 
    *cv=*av + *bv; 
} 

그래서 HERE

av, bv에서 촬영하고, cvF32vec4 그 시점 타입의 포인터 : 사람을 통해서 나를 걸을 수 있다면이 코드가 무엇을하고 있는지

나는 그것을 감사 정말 것 각각 a, bc?

또한 cv의 요소를 액세스하여 일반 부동 소수점 변수에 다시 저장할 수 있습니까?

+1

정확한 질문은 무엇인지 잘 모르겠습니다. 'a','bv'와'cv'는'a'','b''와'c'를 가리키는 포인터입니다. 차이점은'a','b'와'c'는 배열에 대한 포인터입니다. 'av', 'bv'및 'cv'는 하나의 F32vec4가있는 배열에 대한 포인터입니다. – hayesti

답변

0

일반적으로 cv의 단일 요소에 액세스하고 싶지 않다면 대신 c을 사용하면됩니다. 즉, 가능합니다. F32vec4은 실제로 아키텍처의 멀티미디어 레지스터에 대한 고유 변수 유형 인 __m128에 대한 래퍼입니다. 이 레지스터의 개별 요소를 설정/가져 오는 것이 좋지 않은데, 이는 직렬 연산이고 벡터 연산의 목적을 무효화하기 때문입니다. 정말로해야한다면 F32vec4의 [] 연산자에 과부하가 걸립니다. 이것은 intrinsic 레지스터를 float 배열로 캐스팅하고 배열의 특정 요소에서 하나의 요소를로드/저장합니다.