我正在将我用 python 开发的代码重写为 c++,主要是为了提高速度;同时也希望能在这门语言中获得更多的经验。我还计划使用 openMP 将此代码并行化到共享 204GB 内存的 48 个内核上。
我正在编写的程序很简单,我导入了一个 3D 的 hdf5 文件:A[T][X][E],其中 T 与模拟中的每个时间步相关联,X 表示测量场的位置,E( 0:2) 表示 x,y,z 中的电场。
A 中的每个元素都是双精度数,bin 大小跨度为: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 的一个分量,即我想重塑 A[T][X][E] -> B[T][X] 为比如说,E 的 x 分量。
很抱歉这篇冗长的文章,但我想尽可能清楚,并想再次强调我有兴趣学习如何编写最快、最有效的代码。我感谢您的所有建议、时间和智慧。