5
我們在幾個地方對一個向量進行排列,我們需要使用內置的vec_perm
來區分0值。我們一直無法找到vec_zero()
或類似的東西,所以我們想知道我們應該如何處理。如何獲得VSX值爲零?
該代碼目前使用兩種策略。第一個策略是一個載體負載:
__attribute__((aligned(16)))
static const uint8_t z[16] =
{ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
const uint8x16_p8 zero = vec_ld(0, z);
第二種策略是使用掩膜我們打算使用XOR:
__attribute__((aligned(16)))
static const uint8_t m[16] =
{ 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 };
const uint8x16_p8 mask = vec_ld(0, m);
const uint8x16_p8 zero = vec_xor(mask, mask);
我們還沒開始基準(還),所以我們不知道一個人是否比另一個人好。第一種策略使用VMX負載,可能會很昂貴。第二種策略避免了負載,但引入了數據依賴性。
我們如何獲得VSX值爲零?
如果你只是初始化向量變量爲零通常的方式(請注意,有兩種不同的語法,取決於你使用的是哪種編譯器),那麼編譯器通常會選擇哪種方法更有效地將零矢量化爲矢量。 –
你當然可以使用vec_splat的立即形式來表示零和其他小值。 –