私は画像操作アルゴリズムに取り組んでおり、NEON を使用して最適化することを検討しています。このアルゴリズムは、各 (RGBA、8 ビット) ピクセルに重みを掛け、加算を行い、最後に uint8_t 値に変換することで構成されます。最初の問題は、単一の uint8_t ピクセルを効率的に読み込んで NEON の float32x4_t に変換する方法です。リファレンスで適切な変換を検索しましたが、適合する変換が見つからなかったため、次の醜いコードに頼りました。
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);