ARM NEON 組み込み関数について学び、配列内の要素を 2 倍にするために記述した関数のタイミングを計っていました。組み込み関数を使用したバージョンは、単純な C バージョンの関数よりも時間がかかります。
ネオンなし:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int loop;
for( loop= 0; loop<size; loop++)
ptr[loop]<<=1;
return;
}
ネオンの場合:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int i;
uint32x4_t Q0,vector128Output;
for( i=0;i<(SIZE/4);i++)
{
Q0=vld1q_u32(ptr);
Q0=vaddq_u32(Q0,Q0);
vst1q_u32(ptr,Q0);
ptr+=4;
}
return;
}
配列とベクトルの間のロード/ストア操作に時間がかかり、並列追加の利点が相殺されているかどうか疑問に思っています。
更新: Igor の返信に対する詳細情報。
1.コードは次の場所に掲載されています:
plain.c
plain.s
ネオン.c ネオン
.s
両方のアセンブリ リストのセクション(ラベル) L7 から、ネオン バージョンの方がアセンブリ命令の数が多いことがわかります。
2.arm-gcc で -mfpu=neon を使用してコンパイルしました。他のフラグや最適化はありません。プレーン バージョンでは、コンパイラ フラグはまったくありません。
3.それはタイプミスでした。SIZE はサイズであることを意味していました。両方とも同じです。
4,5.4000要素の配列で試しました。関数呼び出しの前後に gettimeofday() を使用して時間を計りました.NEON=230us,ordinary=155us.
6.はい、それぞれの要素を印刷しました。
7.これを実行しましたが、まったく改善されませんでした。