저는 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가 없다는 것을 수정 했습니까?
정말 복잡해집니다. 값을 커버하는 모든 바이트에 플래그 비트를 복제하고'_mm256_blendv_epi8'을 사용하십시오. 모든 32 비트 정수에 대해 0xffffffff의 마스크를 생성 할 수 있다면 이미 필요한 것을 얻을 수 있습니다. –
@Mark Random 내 코드는 가장 높은 비트만 확인하는 blendv에 의존합니다. 하나의 벡터로 인코딩 된 32 개의 참/거짓 값이 있습니다. 나는 값을 선택하기 위해 blendv 앞에 쉬프트를 사용한다. 그러나 cmpxx 내장 함수 중 하나의 결과를 사용할 때 blendv_epi8이 작업을 수행한다는 것에 동의합니다. –
fp 셔플 및 이동과 마찬가지로'blendvps'도 실제로 안전합니다. – harold