2016-09-14 26 views
3

OpenMPで並列forループを実行しています。C++並列化:配列を「再初期化」する速い方法

これは私の問題です:私は4次元配列を持っています.4次元配列の深さは最大値です - 私は4次元の要素のすべてを使用しないかもしれません。この配列では、別の配列のインデックスを格納しています(並列ループ内のインデックスを計算します)。

int my_index_counts[dim_x][dim_y][dim_z] = {(int) 0} 

したがって、同時に

int my_index_array[dim_x][dim_y][dim_z][max_count]; 

、並列ループに、私は別の整数アレイの各4次元ベクトルに格納された要素(すなわち、my_index_array[0][0][0][:])の数を記録してい

こうすると、後でmy_index_countsの値を使用して並列forループを作成できます。私は外側のループの先頭に周りに戻ってきたときに、インデックス数を「再初期化」するために最適な、超高速な方法を必要とする


は、だからここに私の問題です。理想的には、インデックスカウント配列をループして値をリセットしません。しかし、C++では、配列を再初期化できません。私は "memcpy"を見つけました。そしてコピー元の別の "ゼロ"配列を作成するスペースがありますが、これを行う最適な方法はありますか?

+2

ちょうど 'のmemset(my_index_counts、0、はsizeof(my_index_counts))を行うことです迅速かつ汚い方法。 '。それはかなりではないかもしれませんが、それはプラットフォームに依存しないかもしれません(特定のプラットフォーム上で浮動小数点数に対してmemsetを行うことは間違いありませんが、ints tbhについてはわかりません)。何をしているの)。 – RyanP

答えて

0

アレイの初期化では、memsetを使用することができます。これは連続メモリブロックに適しています。あなたのコードは次のようなものでなければなりません:

memset(&my_index_counts[x][y][z], 0, max_count*sizeof(int)); 
x,y,zはすべての指標が、最後の次元です

+0

そのコードは間違っています、RyanPはそれを正しく得ました。 – Ped7g