Iは2D配列と機能のプロトタイプは、私は2次元配列を使用する必要があり、データが512×512であるキャッシュのローカリティを使用してC関数のパフォーマンスを向上させますか?
int diagonal_diff(int x[512][512])
あるとして表現行列の対角の違いを見つけなければなりません。これはSPARCマシン上でテストされています:私の現在のタイミングは6msですが、私は2ms以下にする必要があります。
サンプルデータ:
[3][4][5][9]
[2][8][9][4]
[6][9][7][3]
[5][8][8][2]
差がある:
|4-2| + |5-6| + |9-5| + |9-9| + |4-8| + |3-8| = 2 + 1 + 4 + 0 + 4 + 5 = 16
ことを行うために、私は次のアルゴリズムを使用します。
int i,j,result=0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
result+=abs(array[i][j]-[j][i]);
return result;
をしかし、このアルゴリズムは、アクセスし続けます列、行、列、行などがあり、キャッシュを非効率的に使用します。
私の機能を改善する方法はありますか?
プロフィールましたか?実際の行列の大きさはどれくらいですか? 4×4のマトリックスはキャッシュに収まるので、アイテムにアクセスする順序は関係ありません。 –
これを毎秒50,000,000回行っても、ローエンドの最新のCPUでさえ汗をかくことはありません。 'abs()'への関数呼び出しでさえ、ほとんどのコンパイラ(GCCやVC++を含む)が本質的に本質的に最適化されます。 –
配列のサイズは512x512であり、2D配列を使用する必要があります。インターフェイスの仕様は固定されているので、私はimplementations.int diagonal_diff(int x [512] [512]、int y [512] [512])を記入しなければなりません –