2016-04-13 50 views
0

2次元配列をメモリにどのように格納するのか疑問があります。私は明確にするためにあなたに私のコードを提示します。 私は私のメインループでは、このように2次元配列を定義しています:2次元配列のキャッシュミス

int main() 
{ 
    int i; 
    internalNode**tab =(internalNode **)malloc(sizeof(internalNode *)* DIM); 
    for (i=0; i<DIM ; i++) 
     tab[i] = (internalNode *)malloc(sizeof(internalNode) * DIM); 

    //CODE 

    CalculusOnGrid(tab,DIM); 
} 

DIMは、ユーザー定義の変数であるとinternalNodeが構造体です。

for(i=1;i<DIM-1;i++) 
    for(j=1;j<DIM-j;i++) 
     tab[i][j].temperature_new = 0.25*tab[i+1][j].temperature+tab[i-1][j].temperature + tab[i][j+1].temperature + tab[i][j-1].temperature); 

だから私は私の現在のポイント(i、j)の4人の隣人を検索するつもりです:私は、グリッド(私の2次元配列)にこの計算をするつもりです関数CalculusOnGridで グリッドの

ここで私の質問があります:上と下の要素(つまりタブ[i + 1] []とタブ[i-1] [])上のキャッシュミスを行うか、右と左の要素? (つまり、タブ[] [j + 1]とタブ[] [j-1])

私のコードをスピードアップし、キャッシュミスの数を減らすためのあなたの提案は何ですか?

質問が明確な方法で提案されることを願っています。これが当てはまらない場合は、あなたが欲しいものを私に尋ねてください!

ありがとうございました!

アレッサンドロ

+6

2次元配列ではなく、配列へのポインタの配列です。 – 2501

+0

配列の配列と2次元配列の間の相違点 – Boiethios

答えて

1

キャッシュ・ミスは、あなたが動的配列をエミュレートするために、ポインタベースのルックアップテーブルを使用しないでください多くの理由の一つです。

internalNode (*tab)[DIM] = malloc(sizeof(internalNode[DIM][DIM])); 

free(tab); 

今、メモリが隣接することになり、パフォーマンスが大幅に良くなるはずです。

代わりに、2次元配列を使用します。

+0

DIMが大きすぎない限り、私はそれを述べるべきだと思います。 – 2501

+0

ありがとうございました!ですから、このようにして、1D配列を使って2D配列をemulareしますか? –

+0

@AlessandroBertiniいいえ、2D配列をエミュレートすると、「タイプ* ptr = malloc(x * y * sizeof(* ptr))」、別名「マングルドアレイ」でした。これは真の2D配列です。ちょっとした(* tab)[x] [y]ではなく、 'tab [x] [y]'を実行できるように構文を単純化しました。 [なぜ上記の作品の長文の説明](http://stackoverflow.com/a/32050859/584518)。 – Lundin