0

主に速度を向上させるために、Pythonで開発したコードをc ++に書き直しています。また、この言語でより多くの経験を積むことを望んでいます。また、openMP を使用して、このコードを 204GB のメモリを共有する 48 コアに並列化することも計画しています。

私が書いているプログラムは単純です。3D の hdf5 ファイルをインポートします: A[T][X][E]、T はシミュレーションからの各タイムステップに関連付けられ、X はフィールドが測定される場所を表し、E( 0:2) x、y、z の電場を表します。
A の各要素は double であり、ビンのサイズは A[15000][80][3] です。

私が遭遇した最初の問題は、この「大きな」h5ファイルを配列に入力することであり、続行する前に専門家の意見が必要です。私の最初の試み:

...
#define RANK  3
#define DIM1  15001
#define DIM2  80
#define DIM3  3

using namespace std;
int main (void)
{
//  Define HDF5 variables for opening file. 
hid_t   file1, dataset1;
double bufnew[DIM1][DIM2][DIM3];
herr_t ret;
uint  i, j, k;

file1 = H5Fopen (FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
dataset1 = H5Dopen (file1, "EFieldOnLine", H5P_DEFAULT);
ret = H5Dread (dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL,
                H5P_DEFAULT, bufnew);

cout << "Let's try dumping 0->100 elements" << endl;
for(i=1; i < 100; i++) cout << bufnew[i][20][2] << endl;
...

これにより、配列宣言からセグメンテーション違反が発生します。私の次の動きは、3D 配列 (新規) または 3D ベクトルのいずれかを使用することでした。しかし、私はこれらの方法に対する多くの議論を見てきました。さらに重要なことは、E の 1 つのコンポーネントしか必要としないことです。つまり、A[T][X][E] -> B[T][X]たとえば、E の x コンポーネントです。

長い投稿で申し訳ありませんが、できるだけ明確にしたかったので、最速で最も効率的なコードを書く方法を学ぶことに興味があることをもう一度強調したいと思います. あなたのすべての提案、時間、知恵に感謝します。

4

1 に答える 1

3

配列をローカル変数として定義することは、それをスタックに割り当てることを意味します。通常、スタックは数メガバイトに制限されており、スタック オーバーフローは確実にセグメンテーション違反につながります。new大規模なデータ構造は、動的に (演算子を使用して) または静的に (グローバル変数として定義されている場合)ヒープに割り当てる必要があります。

そのような次元のベクトルのベクトルのベクトルを作成することはお勧めしません。

代わりに、すべての値を格納する 1 次元配列を作成します。

double *bufnew = new double[DIM1*DIM2*DIM3];

次の式でアクセスして、特定の 3D アイテムの線形位置を計算します。

bufnew[(T*DIM2+X)*DIM3+E] = ... ; // bufnew[T][X][E]

正常に動作するはずです。

于 2013-06-12T22:43:46.353 に答える