【发布时间】:2014-02-08 08:35:39
【问题描述】:
我尝试遍历大型 3D 结构数组,但它的运行速度非常慢。 然后我用 1D 数组代替 3D,但没有成功。
我使用下面的结构来描述 3D 网格的一个单元格的参数:
struct cellStruct
{
double v1;
// more variables here
double v15;
double v16;
double v17;
double v18;
};
请看一下两种使用过的方法。
-
3D 数组
#define Nx 500 #define Ny 500 #define Nz 500 cellStruct ***cell; cell = new cellStruct **[Nx]; for(int i=0;i<Nx;i++) { cell[i]=new cellStruct *[Ny]; for(int j=0;j<Ny;j++) cell[i][j]=new cellStruct [Nz]; } for (i = 0; i< Nx; ++i) for (j = 0; j< Ny; ++j) for (k = 0; k< Nz; ++k) { // big algorithm that uses array like in string below cell[i][j][k+1].v1 = cell[i][j+1][k-1].v2 * cell[i+1][Ny-1][k+1].v5; } -
一维数组
#define cell(i,j,k) (cells[(i)*Ny*Nz + (j)*Ny + (k)]) cellStruct *cells = new cellStruct [Nx*Ny*Nz]; for (i = 1; i< Nx-1; ++i) for (j = 1; j< Ny-1; ++j) for (k = 1; k< Nz-1; ++k) { cell(i,j,k+1).v1 = cell(i,j+1,k-1).v2 * cell(i+1,Ny-1,k+1).v5; }
在情况 2 中程序运行得更慢。 我还能如何改进使用大型 3D 阵列的方法? 使用浮点变量可以将计算速度提高两倍,但我希望获得更高的准确性。 使用带有指向内部变量的指针的结构可能会更好,如下所示?
struct cells
{
double ***v1;
// ...
double ***v15;
double ***v16;
double ***v17;
double ***v18;
};
【问题讨论】:
-
如果你的大小都是预处理器定义的,那么你不妨声明
cellStruct[Nx][Ny][Nz]。另外请注意,在第一个示例中,您的程序可能会因为for (k=0; k<Nz; ++k)而不是for (k=0; k<Nz-1; ++k)而崩溃。 -
您是否编译过优化代码?这可能会提高性能。另外,当你的结构单元只包含双精度时,你也可以尝试将它写成数组,这样
cell[i][j+1][k-1].v2就变成了cell[i][j+1][k-1][2],也许这有更多的优化潜力...... -
最近正在帮助解决类似的性能问题,因此请查看我的答案以获取见解。切换到浮点数会使处理数据减半,因此第 3 条更适合您。 PS。指针魔术不会为您带来任何有用的东西
标签: c++ performance bigdata