2016-11-22 1 views
1

저는 AVX2 x86 256 비트 SIMD 확장을 사용하고 있습니다. 32 비트 정수 구성 요소 현명 if-then-else 명령을 수행하려면 싶습니다. 인텔 문서에서 이러한 명령을 vblend라고합니다.어떻게 32 비트 정수에 대한 vblend? 또는 : _mm256_blendv_epi32가없는 이유는 무엇입니까?

인텔 내장 가이드에는 _mm256_blendv_epi8 기능이 있습니다. 이 함수는 거의 필요한 것을 수행합니다. 유일한 문제는 8 비트 정수로 작동한다는 것입니다. 불행히도 _mm256_blendv_epi32 문서가 없습니다. 내 첫 번째 질문은 : 왜이 ​​기능이 존재하지 않는 것입니까? 내 두 번째 질문은 : 어떻게 그것을 모방하는 것인가?

일부 검색 후 _mm256_blendv_ps가 발견되어 32 비트 부동 소수점을 원합니다. 더 나아가 _mm256_castsi256_ps와 _mm256_castps_si256의 캐스팅 함수가 정수에서 32 비트 부동 소수점으로 그리고 다시 캐스팅되었습니다. 함께 이러한 퍼팅 제공 :

inline __m256i _mm256_blendv_epi32 (__m256i a, __m256i b, __m256i mask){ 
    return _mm256_castps_si256( 
     _mm256_blendv_ps(
      _mm256_castsi256_ps(a), 
      _mm256_castsi256_ps(b), 
      _mm256_castsi256_ps(mask) 
     ) 
    ); 
} 

을이 5 개 기능, 그 중 4 만 영광 캐스트하고 하나는 프로세서 명령어에 직접 매핑 보이지만. 따라서 전체 기능은 하나의 프로세서 명령어로 요약됩니다.

그러므로 실제로 어색한 부분은 해당 내장 함수가 누락 된 것을 제외하면 32 비트 blendv가있는 것입니다.

비참하게 실패 할 수있는 경계 사례가 있습니까? 예를 들어 정수 비트 패턴이 부동 소수점 NAN을 나타낼 때 어떻게됩니까? blendv는 이것을 단순히 무시합니까 아니면 신호를 발생시킬 것입니까?

이 경우 작동 : 8 비트, 32 비트 및 64 비트 blendv가 있지만 16 비트 blendv가 없다는 것을 수정 했습니까?

+0

정말 복잡해집니다. 값을 커버하는 모든 바이트에 플래그 비트를 복제하고'_mm256_blendv_epi8'을 사용하십시오. 모든 32 비트 정수에 대해 0xffffffff의 마스크를 생성 할 수 있다면 이미 필요한 것을 얻을 수 있습니다. –

+0

@Mark Random 내 코드는 가장 높은 비트만 확인하는 blendv에 의존합니다. 하나의 벡터로 인코딩 된 32 개의 참/거짓 값이 있습니다. 나는 값을 선택하기 위해 blendv 앞에 쉬프트를 사용한다. 그러나 cmpxx 내장 함수 중 하나의 결과를 사용할 때 blendv_epi8이 작업을 수행한다는 것에 동의합니다. –

+0

fp 셔플 및 이동과 마찬가지로'blendvps'도 실제로 안전합니다. – harold

답변

2

내 코드는 최고 비트만 확인하는 blendv에만 의존합니다.

당신은 좋은 두 가지 옵션이 있습니다 :

  • 방송 VPBLENDVB (_mm256_blendv_epi8)에 대한 설정 (31)에 의해 산술 오른쪽 시프트를 사용하여 각 요소 내에서 높은 비트를. 즉 VPSRAD: mask=_mm256_srai_epi32(mask, 31)입니다.

    VPSRAD는 포트 0에 대해 Intel Haswell에서 1-uop입니다. (Skylake에서 더 많은 처리량 : p01). 알고리즘이 포트 0에서 병목 현상을 일으키는 경우 (예 : 정수 곱셈 및 시프트)이 값은 크지 않습니다.

  • 사용 VBLENDVPS. 모든 캐스트는 컴파일러를 행복하게 유지하는 것이며, VBLENDVPS는 사용자가 원하는대로 정확하게 수행 할 수 있습니다.

    그러나 Intel SnB 계열 CPU는 정수 결과를 FP 블렌드 단위로 전달할 때 1 사이클의 바이 패스 지연 대기 시간을 가지며 블렌드 결과를 다른 정수 명령어로 전달할 때 또 다른 1C 대기 시간을 갖습니다.

우회 지연 대기 시간에 대한 자세한 내용은 Agner Fog's microach guide을 참조하십시오. 그것은 그들이 FP 명령어를위한 __m256i intrinsic을 만들지 않는 이유이며, 그 반대의 경우도 마찬가지입니다. Sandybridge, FP shuffles가 이 아니기 때문에은 PADDD와 같은 명령어로 /에서 전달하는 데 더 많은 대기 시간을주지 않습니다.그래서 SHUFPS는 PUNPCK * 나 PALIGNR이 원하는 것을 정확하게 수행하지 못하면 두 정수 벡터의 데이터를 결합하는 좋은 방법입니다. (정수에 대한 SHUPS는 Nehalem에서도 가치가있을 수 있는데, Nehalem에서는 2c 패널티가있다.)

두 가지 방법으로 벤치 마크을 시도해보십시오. 주변 코드에 따라 어느 쪽이든 좋을 수 있습니다.

지연 시간은 uop 처리량/명령 수와 비교하여 중요하지 않을 수 있습니다. 또한 결과를 메모리에 저장하는 경우 저장소 지침은 데이터가 들어오는 도메인을 신경 쓰지 않습니다.

그러나 이것을 긴 의존성 체인의 일부로 사용하는 경우, 혼합되는 데이터에 대해 추가 2 사이클의 대기 시간을 피할 수있는 추가 지침이 유용 할 수 있습니다.

마스크 생성이 임계 경로에있는 경우 VPSRAD의 1 사이클 대기 시간은 바이 패스 지연 대기 시간과 동일하므로 FP 블렌드를 사용하면 마스크 결과 체인에 대해 대기 시간이 1 여분 추가됩니다 , 데이터 -> 결과 체인에 대해 2 여분의 사이클이 필요합니다. 예를 들어


, 무슨 정수 비트 패턴은 부동 소수점 NAN을 표현하기 위해 발생하면 어떻게됩니까?

BLENDVPS는 상관하지 않습니다. Intel의 insn ref manual fully documents everything an instruction can/can't doSIMD 부동 소수점 예외 : 없음은 이것이 문제가되지 않는다는 것을 의미합니다. 문서에 대한 링크는 태그 위키를 참조하십시오.

FP 블렌드/셔플/비트 별 부울 /로드/저장 명령어는 NaN을 신경 쓰지 않습니다. 실제 FP 수학 (CMPPS, MINPS 등)을 수행하는 지침 만 FP 예외를 발생 시키거나 비정상 종료로 인해 속도가 느려질 수 있습니다. I는 8 비트가 정확한지


AM, 32 비트 및 64 비트 blendv하지만 16 비트 blendv 누락?

예. 그러나 32 비트와 16 비트 산술 시프트가 있으므로 8 비트 입상 블렌드를 사용하는 데에는 최대 하나의 추가 명령어가 필요합니다. (PSRAQ가 없기 때문에 64 비트 정수의 혼합은 마스크 생성이 임계 경로를 벗어나거나 동일한 마스크가 임계 경로에서 여러 번 재사용되지 않는 한 BLENDVPD를 사용하는 것이 가장 좋습니다.

가장 일반적인 유스 케이스는 각 요소가 모두 1 또는 모두 0 인 비교 마스크입니다. 따라서 PAND/PANDN => POR과 혼합 할 수 있습니다. 물론 진리 값으로 마스크의 부호 비트 만 남겨둔 영리한 트릭은 명령어와 대기 시간을 절약 할 수 있습니다. 특히 가변 블렌드가 3 개의 부울 비트 명령어보다 다소 빠르기 때문에 특히 그렇습니다. (예 : 두 개의 부동 소수점 벡터가 2x CMPPS 대신 ORGING이 아닌 음수 값이 아닌지 확인하려면 ORPS 두 개의 실수 벡터가 필요합니다. 음수 영 (0)을 신경 쓰지 않으면 큰 효과가 있습니다).

+0

답변 해 주셔서 감사합니다.그게 많은 정보 야. :) 빠른 질문 : "Sandybridge 이후로 FP 셔플은 여분의 대기 시간이 없다는 것을 기억하십시오."내가 정확히 샌디 브릿지 이상을 대상으로한다면 __m256i, __m256, 및 __m256d 어떤 벌금없이 비트 패턴을 부동 소수점으로 해석하는 작업을 사용하지 않으면? –

+0

@ B.S .: 아니, 나는 내가 말한 것을 정확하게 의미했다. FP 셔플은 그 속성을 갖지만 FP 블렌드는 그렇지 않습니다. 아마 물리적으로 하나의 셔플 실행 유닛 만있을 것이고, FP와 ivec 포워딩 네트워크 모두에 연결되어있을 것입니다. 그러나 블렌딩은 싸다 (트랜지스터 방식). 포워딩 네트워크 중 하나에만 연결된 별도의 블렌드 유닛이 있다고 생각한다. –

관련 문제