0

効率的なアクセスに関する質問: 列ごとに大きな行列 (2000x2000 以上) にアクセスする必要があります。私のアルゴリズムでは、1 行パスと 1 列パスが必要です。行パスはメモリ効率 (キャッシュ ミス) のためには問題ありませんが、列パスのキャッシュ ミスを減らすにはどうすればよいでしょうか? 効率が必要です。

私が持っていた唯一のものは次のようなものです:nローカル変数を宣言します(メモリフェッチサイズに基づく)、

int a1, a2, a3, a4; for ( int j = 0 ; j < DIM_Y ; j+=4 ) for ( int i = 0 ; i < DIM_X ; i++ ) a1 = matrix[i][j]; ... ; a4 = matrix[i][j+4]; // make the column processing on the 4 variables.

それは C または C++ であり、配列または int または char です。

任意の提案とコメントを歓迎します。

ありがとう。

4

2 に答える 2

1

次の 2 つの基本的な手法が適用されます。

1) ループブロッキング

それ以外の

 for (j=0;j<2000;j++)
   for (i=0;i<2000;i++) 
     process_element(i,j);

使用する

for (j=0;j<2000;j+=8) 
  for (i=0;i<2000;i+=8) 
    process_block_of_8x8(i,j);

2) 2 の累乗でない行ストライド (例: 8192 バイト + 64) -- 必要に応じてパディング

この場合、row[i] ..row[i+7] は同じキャッシュ ラインを争うことはありません。

データは、手動で計算されたパディングを使用して連続メモリ領域にある必要があります。

于 2013-02-04T10:41:17.103 に答える
0

2D マトリックスを格納する効率的な方法は、次のCようなスタイル配列を使用することです。

| a11 a12 a13 |
| a21 a22 a23 |   -> memory: [a11,a12,a13,a21,a22,a23,a31,a32,a33]
| a31 a32 a33 | 

Element(i,j) = memory[N_COL*i+j]

ここで、iは から始まる行番号のインデックス、も から始まる列番号のインデックス、および0列の数です。j0N_COL

うまくいけば、コンパイラ/jit はすべての値を順番にメモリに配置して、すばやくアクセスできるようにします。通常、コンパイラをだまそうとすればするほど (手動のループ展開など)、パフォーマンスが低下します。きれいなコードを書いて、コンパイラに任せましょう。

于 2013-02-02T21:58:11.840 に答える