2

OMAP3530 は、ARM プロセッサと C64x+ DSP を実装しています。ARM よりも DSP の方が高速に実行されると予想されるテスト ループがありますが、そうではありません。

ループ:

#define DIM 4
#define LIM 1000
#define MASK 3

int i, j;
uint32 arr[DIM][DIM] = {0};
uint32 rand[DIM][DIM] = {1, 5, 2, 7,
                         5, 4, 3, 8,
                         1, 2, 9, 3,
                         6, 6, 8, 4};

for (i = 0; i < LIM; i++)
    for (j = 0; j < LIM; j++)
        arr[i & MASK][j & MASK] += rand[i & MASK][j & MASK];

ベンチマーク:

  • アーム: 5ms

  • DSP: 25ms

DSP のポイントは、このような単純な算術演算を処理することなので、より高速であることを期待していました。私は DSP にかなり慣れていないので、DSP の構成はあまり行っていません。キャッシュが構成されていないと思うので、それを調べていますが、他の提案を歓迎します。

誰でも可能な解決策についてアドバイスできますか?

編集-LIM反復回数を増やすために、値を 5000 に変更しました。新しいベンチマーク:

  • アーム: 120ms

  • DSP: 530ms

4

1 に答える 1

2

私はこれが起こるのを見たことがあります。DSP の使用は、非常に特殊なシナリオでのみ有効です。100 万回の追加は確かにユースケースではありません。ARM A8 が数値の追加にひどく悪いというわけではないので、低速のコプロセッサで ARM で非常に効率的なコードを実行しています。それは単に物事をスピードアップしません。

あなたが見ている特定のOMAPには、NEONを備えたARM Cortex A8コアがあります。つまり、単一命令複数データの乗算/累積命令があります。私の経験では、これらは、コンパイラーにループをできるだけ効率的に実装させるよりも高速である必要があります。ただし、どこかで乗算も行っていると仮定すると、マイレージは異なる場合があります。

手動で最適化された組み込み関数が豊富なプラットフォーム固有のコードの力を解き放ちたい場合は、 GNU RadioプロジェクトからスピンオフしVOLKください一般的な実装、ほとんどのカーネルの x86/MMX/SSE2/AVX、およびそれらの一部の NEON 実装をカバーしています。あなたの問題に特に関心があるのはカーネルかもしれません。16i_x5_add_quad_16i_x4

結論として、C64x がかなり有能な OMAP よりも多くの利点を持っていることが確かでない限り、私はそれを使用しません。これは DSP のより大きなループの一部であると述べていますが、アルゴリズムが DSP で実行したサイクルをカウントする手段がまだありません。開発セットアップを決定しやすい状態にすることをお勧めします。あなたの実装がどれほど良いか。ARM の汎用タイマーは、確かに良いベンチマークではありません。

于 2015-11-16T08:52:28.053 に答える