我正在研究圖像處理算法,並且正在研究使用NEON對其進行優化。該算法包括將每個(RGBA,8位)像素乘以某個權重,進行一些加法並最終轉換回uint8_t值。 我遇到的第一個問題是如何有效地將單個uint8_t像素加載並轉換爲NEON的float32x4_t。我搜索一個合適的轉換的參考,並不能找到一個適合,所以我使出了這個醜陋的代碼:如何在ARM NEON中將uint8x8_t加載到float32x4中?
const uint8_t* psrc = ...; // pointer to image data
float rgba[4];
for (int c = 0; c < 4; ++c) {
rgba[c] = *psrc++;
}
float32x4_t srcpix = vld1q_f32(rgba);
任何人都可以建議對這個「清潔」的方式?
編輯: 所以我想出了這個,還是覺得很麻煩:
uint8x8_t srcu8 = vld1_u8(psrc);
uint16x8_t srcu16x8 = vmovl_u8(srcu8);
uint16x4_t srcu16x4 = vget_low_u16(srcu16x8);
uint32x4_t srcu32x4 = vmovl_u16(srcu16x4);
srcpix = vcvtq_f32_u32(srcu32x4);
感謝您的快速回復,我想出了一個與您的方法類似的不同版本。它仍然看起來像很多拓寬和轉換給我.. – avish
@avish與我談論的完全一樣 – Alex