主に速度を向上させるために、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 コンポーネントです。
長い投稿で申し訳ありませんが、できるだけ明確にしたかったので、最速で最も効率的なコードを書く方法を学ぶことに興味があることをもう一度強調したいと思います. あなたのすべての提案、時間、知恵に感謝します。