0

我正在将我用 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 分量。

很抱歉这篇冗长的文章,但我想尽可能清楚,并想再次强调我有兴趣学习如何编写最快、最有效的代码。我感谢您的所有建议、时间和智慧。

4

1 回答 1

3

将数组定义为局部变量意味着将其分配到堆栈上。堆栈通常被限制为几兆字节,堆栈溢出肯定会导致段错误。大型数据结构应该在堆上动态分配(使用new运算符)或静态分配(当定义为全局变量时)。

我不建议为这些维度制作向量的向量。

相反,创建一个一维数组来存储所有值

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

并使用以下公式访问它以计算给定 3D 项目的线性位置

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

应该可以正常工作。

于 2013-06-12T22:43:46.353 回答