OpenCV を使用して組み込みシステム (BeagleBone Black) で画像処理を行っており、NEON 最適化を利用するためにコードを記述する必要があります。具体的には、NEON に最適化されたしきい値関数を書き、次に NEON に最適化された浸食/膨張関数を書きたいと思います。
NEON コードを書くのはこれが初めてで、アセンブリ コードを書いた経験がないので、C スタイルのNEON 組み込み関数の例とリソースを調べてきました。いくつかの実用的なコードをまとめることができると信じていますが、ベクトルをどのように構成すればよいかわかりません。「 ARMコンパイラでのARM NEONサポート」ホワイトペーパーの2ページによると:
「これらのレジスタは、8、16、32、または 64 ビットの項目の「ベクトル」を保持できます。C/C++ で記述されたアルゴリズムを最適化または移植する際の伝統的なアドバイスは、データ処理にマシンの自然な型を使用することです ( ARM 32 ビットの) . 不要なビットは、メモリに格納する前にキャストやシフトによって破棄できます。」
これは正確にはどういう意味ですか?NEON コードをuint32x4_t
ではなくベクトルを使用するように制限する必要がありuint8x16_t
ますか? レジスタをロードするにはどうすればよいですか?vst1q_u8
それとも、データをメモリに保存するために使用するときに特別な手順を実行する必要があるということですか?
私はこの例を見つけました。これはテストされていませんが、uint8x16_t
タイプを使用しています。上記の「32ビット」のアドバイスに準拠していますか?
誰かが上記の引用について詳しく説明し、非常に簡単な実例を提供していただければ幸いです。