의 PALIGNR 명령은 다음과 수행 128 비트. 진부하게도 intrinsic 함수 _mm256_alignr_epi8
(VPALIGNR)은 256 비트 레지스터에서만 _mm_alignr_epi8
과 동일한 연산을 수행한다고 믿었습니다. 슬프게도 그러나, 정확히는 그렇지 않습니다. 사실 _mm256_alignr_epi8
은 256 비트 레지스터를 2 128 비트 레지스터로 취급하고 인접한 두 개의 128 비트 레지스터에서 2 "정렬"연산을 수행합니다. _mm_alignr_epi8
과 같은 작업을 효과적으로 수행하지만 한 번에 2 개의 레지스터를 사용합니다. 가장 명확하게 여기에 설명 있어요 : 현재 내 솔루션입니다_mm_alignr_epi8 AVX2에 해당하는 (PALIGNR는)
_mm256_alignr_epi8이 _mm_alignr_epi8
를 계속 사용하는 YMM (256 비트) 등록을 분할하여 두 개의 XMM (128 비트) (높고 낮음) 레지스터로,과 같이 :
__m128i xmm_ymm1_hi = _mm256_extractf128_si256(ymm1, 0);
__m128i xmm_ymm1_lo = _mm256_extractf128_si256(ymm1, 1);
__m128i xmm_ymm2_hi = _mm256_extractf128_si256(ymm2, 0);
__m128i xmm_ymm_aligned_lo = _mm_alignr_epi8(xmm_ymm1_lo, xmm_ymm1_hi, 1);
__m128i xmm_ymm_aligned_hi = _mm_alignr_epi8(xmm_ymm2_hi, xmm_ymm1_lo, 1);
__m256i xmm_ymm_aligned = _mm256_set_m128i(xmm_ymm_aligned_lo, xmm_ymm_aligned_hi);
이 방법은 효과가 있지만 더 좋은 방법이 있어야합니다. 동일한 결과를 얻기 위해 사용해야하는 "일반"AVX2 명령어가 있습니까?
그래, 그것도 같은 해결책입니다. 하지만 이것이 유일한 방법이라면 AVX2 명령어의 설계자가 큰 감독처럼 보입니다. – eladidan
컴파일 할 수 없습니다 ... 컴파일 오류가 발생합니다. "심각한 오류 : 내장 매개 변수는 즉각적인 값이어야합니다" 다음 줄에 : "__m128i vouth = _mm_alignr_epi8 (v0l, v0h, n);". 대체로, n은 이교도가 아니기 때문에. 어떻게 이것을 우회 할 수 있었습니까? 나는 인텔 C++ 컴파일러 – eladidan
을 사용하고 있습니다. n이 컴파일시의 상수 일 때만 제게 적합합니다. 인텔 ICC 컴파일러도 사용하고 있지만 C++보다는 C++로 컴파일하면 차이가 있습니다. gcc로 나를 위해 일합니다. –