1

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ビット」のアドバイスに準拠していますか?

誰かが上記の引用について詳しく説明し、非常に簡単な実例を提供していただければ幸いです。

4

1 に答える 1

2

リンクしたドキュメントの次の文が答えです。

命令でデータ幅を指定する NEON の機能により、レジスタ幅全体を有用な情報に使用できるということは、アルゴリズムの自然な型を維持することが可能であり、望ましいことを意味します。

ドキュメントは、マシンの自然なタイプ(32ビット)とアルゴリズムの自然なタイプ(あなたの場合はuint8_t)を区別していることに注意してください。

The document is saying that in the past you would have written your code in such a way that it used 32-bit integers so that it could use the efficient machine instructions suited for 32-bit operations.

With Neon, this is not necessary. It is more useful to use the data type you actually want to use, as Neon can efficiently operate on those data types.

It will depend on your algorithm as to the optimal choice of register width (uint8x8_t or uint8x16_t).

To give a simple example of using the Neon intrinsics to add two sets of uint8_t:

#include <arm_neon.h>
void
foo (uint8_t a, uint8_t *b, uint8_t *c)
{
  uint8x16_t t1 = vld1q_u8 (a);
  uint8x16_t t2 = vld1q_u8 (b);
  uint8x16_t t3 = vaddq_u8 (a, b);
  vst1q_u8 (c, t3);
} 
于 2013-10-17T09:23:30.460 に答える