2012-06-15 3 views
0

Intel SSE intrinsics에 대한 다양한 산술 연산과 관련하여 질문이 있습니다. _mm_add_ps와 Vs.의 차이점은 무엇입니까? _mm_add_epi8/16/32? 내 데이터가 항상 정렬되도록하고 싶습니다. 샘플 코드에서Intel SSE SIMD 내장 함수로 작업

나는이 작업을 수행 할 때

__m128 u1 = _mm_load_ps(&V[(i-1)]); 

나는 세그먼트 오류를 ​​얻을. 하지만 이렇게하면 :

__m128 u1 = _mm_loadu_ps(&V[(i-1)]); 

잘 작동합니다.

posix_memalign((void**)&V, 16, dx*sizeof(float)); 

누군가가이 문제를 설명 할 수 있습니다 :

나는 내 데이터 내가 이런 식으로 배열을 선언 정렬 원하기 때문에.

+1

, 당신이 실제로 알고 싶어? 다른 추가 사항의 차이점은 데이터를 처리하는 데이터 유형이 무엇인지입니다. – harold

답변

4

_mm_add_psfloats를 합치십시오. 여기에서 _mm_add_epi8/16/32은 부동 소수점 숫자가 아닌 정수를 더합니다. _mm_load_ps는 16 바이트 정렬을 필요로하지 반면

_mm_loadu_ps하지는 16 바이트 (128 비트) 정렬 할 당신의 수레를 필요로한다.

첫 번째 오류에서 seg 오류가 발생하면 정렬이 잘못되었습니다. [EINVAL 상기 얼라인먼트 파라미터의 값은를 sizeof 두 다수의 전력

아니다

: 만약() 함수는 실패한다

posix_memalign 다음 posix_memalign 페이지

는이 말한다 (void *).

는 잘 모르겠어요 sizeof(float) == sizeof(void*)을 그 ?? this에 따르면 C에서 (32 비트 시스템에서) 동일하게 보입니다. 일반적으로 포인터의 크기는 사용하는 시스템에 따라 32 비트 또는 64 비트 (8 바이트)의 CPU 레지스터 너비 크기이므로 일반적으로 32 비트 (4 바이트)가됩니다.

귀하의 정렬 할당은 더 다음과 같아야합니다

posix_memalign((void**)&V, 16, dx*sizeof(void*)); //since it will the correct size for your platform. You can always cast to `float` later on. 
당신은 다른 추가 및 정렬에 대해 뭔가에 대해 뭔가를 요구하고
+1

마지막 진술은 사실이 아닙니다. 'float'은 (보통) 4 바이트입니다. 'void *'는 포인터의 크기이다. (일반적으로 32 비트에서 4 바이트, 64 비트에서 8 바이트) – Mysticial

+0

@Mysticial yea, 나는 이상하게 보였지만, 왜 내 작은 테스트에서 '똑같이'인쇄합니까? 실수로 포인터가 4 바이트이고'float'도 4 바이트 인 32 비트 시스템일까요? –

+2

그 케이스는 확실히 32 비트에서 컴파일되고 있습니다. 64 비트를 사용해보십시오. – Mysticial

관련 문제