我尝试循环通过大型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;
}
1D数组
#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;
};
答案 0 :(得分:0)
好500 ^ 3是相当大的 - &gt; 125M细胞
你只能这样做:
1.rewrite计算更有效
2.使用多线程
3.打包输入数据
答案 1 :(得分:0)
由于您希望提高缓存效率,将结构数组转换为数组结构将对您有所帮助。
我几乎肯定你必须将三重间接指针转换为一维数组,以使数组结构的思想有效。
struct cellStruct
{
double* v1; // you can use std::vector<double> instead of double*
// more variables here
double* v15;
double* v16;
double* v17;
double* v18;
};
由于您的计算仅使用v1
,v2
和v5
,因此最好禁用缓存所有其他变量。使用struct-of-arrays布局为v1
,v2
,v3
等分配不同的内存区域 - 所以你不要强制缓存加载这些无用的{{1 }},v3
,v4
,...
一些语法调整:
v6