0

マトリックス効率をチェックするアプリケーションを作成します。私はさまざまな方法を使用します (たとえば、変更ループ、2/3 ループ、openmp など)。1 つ残っているのは、データのプリフェッチを確認する必要があるということです。

コード:

#define SIZE 5000

for(int i=0;i<SIZE;i++)
 for(int j=0;j<SIZE;j++)
   mul+=tab[i][j]

通常prefetch、データは単独で処理されますが (1 つの行にあり、 がインクリメントされる場合)、常にではありませjん (たとえば、次の行に移動する場合や、次の行に移動する場合 ( ))。などからのデータをカウントする前に、このコードを変更する方法を教えてください。tab[0][0]prefechedloop i++ ,tab[i][0]proc prefetchtab[0][0], tab[1][0],tab[2][0],tab[3][0]

4

1 に答える 1

1

prefetch 組み込み関数を使用できます。

void _m_prefetch(void *);

現在の場所より少なくとも 128 バイト先にプリフェッチする必要があります。各プリフェッチ間で適切な量の作業が行われるように、おそらくループをアンロールする必要があります。そうしないと、実際のプリフェッチ命令でクロック サイクルが浪費されます。

ただし、メモリを「まっすぐに」読んでいるので、プロセッサはそれ自体で適切なプリフェッチを行うのではないかと思います[タブは、実行時に構築された配列ではなく、2次元のコンパイル時配列であると仮定します]。

于 2013-01-20T14:02:47.530 に答える