int
arabelleği bir 12812 int
kayıt defterine, bir int
arabelleği ters sırada yüklemek için herhangi bir SSE2 komutu var mı?SSE2 talimatı tamsayıları tersi sırada yüklemek için talimatlar
cevap
Bu normal yük sonra 32 bit int
unsurları ters oldukça kolay:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
Sen 16 bit short
elemanları aynı şeyi yapabilir, ama daha talimatları alır:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1
v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1
SSSE3 mevcut olup olmadığını, daha az talimatları _mm_shuffle_epi8
(PSHUFB
) kullanarak bunu unutmayın:
const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
// initialise vector mask for use with PSHUFB
// NB: do this once, outside any processing loop
...
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi8(v, vm); // PSHUFB
DÜZENLEME: En yaklaşık (ve kullanışlı) içsel _mm_loadr_ps
olduğunu
(aşağıdaki ihtimale buradan bırakarak tek hassasiyetli kayar nokta skalerler içindir). Adresin 16bayta hizalanmış olması gerektiğini unutmayın.
bu içsel talimat (+ karıştırma MOVAPS
) daha daha çevirir rağmen.
Yanıt için teşekkürler, ancak bu komut ters sırayla dört tek kesinlikli, kayan nokta değerleri yükler. Tamsayılar için aynı işlemi arıyorum ama bunun için destek yok sanırım. – Andy
Evet Tam sayı değerleri hakkında konuştuğunuzu farketmediniz (başlığınızı yeniden okumuş olmalısınız). Paul R cevabı senin ihtiyacın olan şey. – Trax
Evet.Sadece meraklı, aynı işlem kısa değerler ile yapılabilir mi? – Andy
Teşekkürler Paul.Your mantığınız iyi çalışıyor.Ama ikinci "0x1B" parametresinin kullanımını anlayamadım. Bir çeşit maske mi? Başka bir şüphe var ... Aynı ameliyatı şortlarla yapmak mümkün mü? – Andy
Yükleme ve geri vites şortu için ikinci bir örnek ekledim. Maske Intel dokümanlarında ele alındı, ancak nasıl oluşturulduğunu göstermek için yorumlar ekledim. –
P.S. [Intel Intrinsics Guide] 'ı (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - WIN/Mac OS X/Linux için çok kullanışlı bir aracı indirmenizi tavsiye ederim. SSE/AVX talimatları ve intrinsikler çok erişilebilir bir şekilde. –