我想知道是否有一種快速的方法可以將int8陣列相乘,i.e.
for(i = 0; i < n; i)
z[i] = x * y[i]。
我看到Intel intrinsics指南列出了幾個SIMD指令,如_mm_mulhi_epi16和_mm_mullo_epi16,對int16做類似的事情。對于int8,是否有類似的東西是我所忽略的?
uj5u.com熱心網友回復:
將輸入分成低& 高,可以
__m128i const kff00ff00 = _mm_set1_epi32(0xff00ff00) 。
__m128i lo = _mm_mullo_epi16(y, x);
__m128i hi = _mm_mullo_epi16(_mm_and_si128(y, kff00ff00), x);
__m128i z = _mm_blendv_epi8(lo, hi, kff00ff00)。
AFAIK,高位YY的YYyy|YYyy|YYyy|YYyy乘以00xx|00xx|00xx不會干擾低8位? ?ll,同樣,YY00|YY00*00xx|00xx的乘積在HH00產生正確的8位乘積。這兩個在正確排列的結果需要混合在一起。
__m128
__m128i x = _mm_set1_epi16(scalar_x);, and __m128i y = _mm_loadu_si128(..);
另一種方法是使用shufb計算LutLo[y & 15] LutHi[y >> 4],不幸的是移位也必須由_mm_and_si128(_mm_srli_epi16(y,4),_mm_set1_epi8(15))來模擬。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320396.html
標籤:
