我正在将我在python中开发的代码重写为c ++,主要是为了提高速度;同时也希望获得更多这种语言的经验。我还计划使用openMP将此代码并行化到48个共享204GB内存的内核上。
我写的程序很简单,我导入一个3D的hdf5文件: A [T] [X] [E],其中T与来自模拟的每个时间步相关联,X表示测量场的位置,E(0:2)表示x,y,z中的电场。 /> A中的每个元素都是double,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] - &gt; B [T] [X],例如E的x分量。
对于冗长的帖子感到抱歉,但我希望尽可能清楚,并再次强调我有兴趣学习如何编写最快,最有效的代码。 我感谢您的所有建议,时间和智慧。
答案 0 :(得分:3)
将数组定义为局部变量意味着在堆栈上分配它。堆栈通常限制为几兆字节,堆栈溢出肯定会导致段错误。大型数据结构应该在堆上动态分配(使用new
运算符)或静态分配(当定义为全局变量时)。
我不建议为这样的维度制作矢量矢量矢量。
相反,创建一维数组来存储所有值
double *bufnew = new double[DIM1*DIM2*DIM3];
并使用以下公式访问它以计算给定3D项目的线性位置
bufnew[(T*DIM2+X)*DIM3+E] = ... ; // bufnew[T][X][E]
应该可以正常工作。