2013-04-25 6 views
12

SIMD 지원을 구현하는 동안 인텔의 내장 함수 가이드를 읽었습니다. 나는 약간의 혼란을 가지고 있으며 나의 질문은 아래와 같다.SIMD와 팩형 및 스칼라 배정 밀도의 차이

  1. __m128 _mm_cmpeq_ps (__m128 a, __m128 b) 설명서에는 압축 된 단 정밀도 부동 소수점을 비교하는 데 사용됩니다. "포장 된"의미는 무엇입니까? 플로트 값을 사용하기 전에 어떻게 든 포장해야합니까?

  2. 이중 정밀도의 경우에는 _mm_cmpeq_sd과 같은 내장 함수가 있는데 이는 "낮은"배정 밀도 부동 소수점 요소를 비교하는 것을 의미합니다. lower와 upper 배정 밀도 elemtns는 무엇을 의미합니까? 그것들을 사용하여 C++ double 타입 요소의 벡터를 비교할 수 있습니까? 아니면 내가 그들을 비교하기 전에 그들을 어떤 방식으로 처리해야합니까?

답변

14

SSE에서 128 비트 레지스터는 32 비트의 4 요소로 나타낼 수 있습니다.

SSE는 두 가지 유형의 연산을 정의합니다. 스칼라 포장. 스칼라 연산은 최하위 데이터 요소 (비트 0 ~ 31)에서만 작동하며 팩 연산은 네 요소를 모두 병렬로 계산합니다.

_mm_cmpeq_sd은 두 피연산자의 최하위 데이터 요소 (처음 32 비트) 만 비교하고 _mm_cmpeq_ps은 병렬로 32 비트의 각 그룹을 비교합니다.

두 배로 64 비트를 사용하는 경우 128 비트 공간을 사용하도록 두 배로 팩할 수 있습니다. 그런 식으로 _mm_cmpeq_ps은 병렬로 4 개의 double을 2 번 비교할 수 있습니다.

한 번에 한 번만 비교하려면 _mm_cmpeq_pd을 사용하여 두 개의 64 비트를 두 번 비교하는 경우을 비교할 수 있습니다.

_mm_cmpeq_pd은 SSE2이고 _mm_cmpeq_ps은 SSE입니다.

9

"packed"는 "동일한 유형의 여러 항목을 하나의 덩어리에 넣음"을 의미하므로 - "packed single precision floating point"는 128 비트 값으로 저장된 4 * 32 비트 부동 소수점 수를 의미합니다.

다양한 PACK* 지침을 사용하여 레지스터에 각 값을 "팩"하거나 데이터를 이미 메모리에 "포장"해야합니다 (예 : 4 개의 부동 소수점 치의 값의 배수.

스칼라는 레지스터의 하위 n 비트에 "하나의 값"을 의미합니다 (예 : double은 128 비트 SSE 레지스터의 하위 64 비트).