Nel SSE3, l'istruzione PALIGNR esegue le seguenti:_mm_alignr_epi8 (PALIGNR) equivalente in AVX2
PALIGNR concatenates the destination operand (the first operand) and the source operand (the second operand) into an intermediate composite, shifts the composite at byte granularity to the right by a constant immediate, and extracts the right-aligned result into the destination.
Sono attualmente nel mezzo di porting mio codice SSE4 di utilizzare istruzioni AVX2 e lavorando su 256bit registra, invece di 128bit. Ingenuamente, credevo che la funzione intrinseca _mm256_alignr_epi8
(VPALIGNR) eseguisse la stessa operazione di _mm_alignr_epi8
solo su registri a 256 bit. Purtroppo però, non è esattamente il caso. Infatti, lo _mm256_alignr_epi8
considera il registro a 256 bit come 2 registri a 128 bit ed esegue 2 operazioni di "allineamento" sui due registri a 128 bit adiacenti. Effettivamente eseguendo la stessa operazione di _mm_alignr_epi8
ma su 2 registri contemporaneamente. E 'più chiaramente illustrato qui: _mm256_alignr_epi8
Attualmente la mia soluzione è quella di continuare a utilizzare _mm_alignr_epi8
suddividendo il YMM (256bit) registra in due XMM (128 bit) registri (alti e bassi), in questo modo:
__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);
Funziona, ma ci deve essere un modo migliore, giusto? Esiste forse un'istruzione AVX2 "generale" che dovrebbe essere utilizzata per ottenere lo stesso risultato?
sì, è la stessa soluzione. ma se questo è l'unico modo, allora sembra una grande svista dai progettisti delle istruzioni AVX2 – eladidan
Non ho potuto ottenere questo per compilare ... ottengo l'errore di compilazione: "errore catastrofico: il parametro intrinseco deve essere un valore immediato" nella riga seguente: "__m128i vouth = _mm_alignr_epi8 (v0l, v0h, n);". Supposivamente, perché n non è un immidiato. Come sei riuscito a bypassare questo? Sto usando Intel C++ Compiler – eladidan
Funziona per me, purché n sia una costante in fase di compilazione - Sto usando anche il compilatore Intel ICC, ma sto compilando come C piuttosto che C++ se questo fa alcuna differenza, e anche lavora per me con gcc. –