C++ 如何优化a';对于循环';对于3d复合体<;双倍>;数组以提高C+中的速度+;
此代码中的所有数组在此代码中都是复杂类型,此for循环的运行时间约为1分钟。Ktemp是大小为141*1202*141的数组。有人能帮我优化这段代码并节省运行时间吗C++ 如何优化a';对于循环';对于3d复合体<;双倍>;数组以提高C+中的速度+;,c++,arrays,matlab,C++,Arrays,Matlab,此代码中的所有数组在此代码中都是复杂类型,此for循环的运行时间约为1分钟。Ktemp是大小为141*1202*141的数组。有人能帮我优化这段代码并节省运行时间吗 complex<double> ***P1; P1 = new complex<double>**[141]; for (i = 0; i < num_y; i++) { P1[i] = new complex<double
complex<double> ***P1;
P1 = new complex<double>**[141];
for (i = 0; i < num_y; i++)
{
P1[i] = new complex<double> *[1202];
for (j = 0; j < tsize; j++)
{
P1[i][j] = new complex<double>[141];
}
}
for (int zz = 1; zz < 20; zz++)//in z direction
{
for (i = 0; i < 141; i++)
{
for (j = 0; j < 1202; j++)
{
for (k = 0; k < 141; k++)
{
if (Ktemp[i][j][k].real() <= 0)
{
P1[i][j][k] = 0;
}
else
{
P1[i][j][k] = excit_pfft[i][j][k] * expn[i][j][k];
}
}
}
}
excit_pfft = P1;
}
complex***P1;
P1=新复合体**[141];
对于(i=0;i
complex<double> P1[141][1202][141];
复合体P1[141][1202][141];
而不是:
complex<double> ***P1;
P1 = new complex<double>**[141];
for (i = 0; i < num_y; i++)
{
P1[i] = new complex<double> *[1202];
for (j = 0; j < tsize; j++)
{
P1[i][j] = new complex<double>[141];
}
}
complex***P1;
P1=新复合体**[141];
对于(i=0;i
因为我不知道这到底是什么,我假设:
for (int zz = 1; zz < 20; zz++)//in z direction
{
for (i = 0; i < 141; i++)
{
for (j = 0; j < 1202; j++)
{
for (k = 0; k < 141; k++)
{
if (Ktemp[i][j][k].real() <= 0)
{
P1[i][j][k] = 0;
}
else
{
P1[i][j][k] = excit_pfft[i][j][k] * expn[i][j][k];
}
}
}
}
excit_pfft = P1;
}
(intzz=1;zz<20;zz++)的for//在z方向
{
对于(i=0;i<141;i++)
{
对于(j=0;j<1202;j++)
{
对于(k=0;k<141;k++)
{
如果(Ktemp[i][j][k].real()由于重复乘以expn中的值(即计算指数),可以使用pow函数更有效地执行此操作,并摆脱zz循环:
for (i = 0; i < 141; i++)
{
for (j = 0; j < 1202; j++)
{
for (k = 0; k < 141; k++)
{
if (Ktemp[i][j][k].real() <= 0)
{
excit_pfft[i][j][k] = 0;
}
else
{
excit_pfft[i][j][k] = excit_pfft[i][j][k] * pow(expn[i][j][k], 20);
}
}
}
}
(i=0;i<141;i++)的
{
对于(j=0;j<1202;j++)
{
对于(k=0;k<141;k++)
{
if(Ktemp[i][j][k].real()对于初学者来说,您可能应该尝试使用一个std::vector
来保存所有的复杂的es,现在您有170000个分配,并且您可能正在遭受大量缓存未命中的痛苦。在您的第一个代码块中,zz
循环的作用是什么?它不做任何事情,只是让您遍历所有内容ng 20次。对于zz回路:激子pfft=P1@user657267向量可以包含复数元素?而且,我认为向量的效率不如数组。无论如何,我要试试now@gugabrielle您使用的是什么处理器/编译器?您有权访问“英特尔矢量化”吗?通过添加这些扩展,您可以获得巨大的性能提升当使用for循环时。这将是对上述建议的补充。嗯……在堆栈上分配~400MB?你会过得不好。complex P1[141][1202][141]
我怀疑您的堆栈是否有这么大的空间。您是对的,我没有考虑大小…我将编辑答案以使用向量来代替。@AymarFisherman在下面的代码中,将出现错误:下标超出范围…int num_y=141;intt_cyc=1202;intnum_x=141;向量P1;P1.保留(num_y);for(i=0;i for (int zz = 1; zz < 20; zz++)//in z direction
{
for (i = 0; i < 141; i++)
{
for (j = 0; j < 1202; j++)
{
for (k = 0; k < 141; k++)
{
if (Ktemp[i][j][k].real() <= 0)
{
P1[i][j][k] = 0;
}
else
{
P1[i][j][k] = P1[i][j][k] * expn[i][j][k];
}
}
}
}
}
for (i = 0; i < 141; i++)
{
for (j = 0; j < 1202; j++)
{
for (k = 0; k < 141; k++)
{
if (Ktemp[i][j][k].real() <= 0)
{
excit_pfft[i][j][k] = 0;
}
else
{
excit_pfft[i][j][k] = excit_pfft[i][j][k] * pow(expn[i][j][k], 20);
}
}
}
}