3

私は画像操作アルゴリズムに取り組んでおり、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);
4

3 に答える 3

0

私が知っているように、NEON32ビットの変換のみをサポートしています(を使用すると、との間でvcvt_...()変換できます(例))。したがって、 を に変換し、その後の両方の半分にを使用する必要があります。float32x4_tint32x4_tuint8x8_tuint32x4x2_tvcvtuint32x4x2_t

編集: 残念ながら、私はコードをあまり使用しておらず、コマンドを覚えていないため、コードを提供できません。

于 2013-06-19T17:15:54.423 に答える