【发布时间】:2016-05-14 22:15:27
【问题描述】:
我有一个大小为 (m * l * 4) 的矩阵 A,m 的大小约为 100,000 且 l=100。列表的大小总是等于 n 并且 n
void MatrixAddition(int l, int n, vector<int>& list, int ***A,int ***C,int cluster)
{
for(int i=0;i<l;i++)
{
for(int j=0;j<4;j++)
C[cluster][i][j]=0;
}
for (int i = 0; i < l; i++)
{
for(int j=0;j<n;++j)
{
for(int k=0;k<4;k++)
C[cluster][i][k]+=A[list[j]][i][k];
}
}
}
我使用 gprof 计算整个代码中每个函数花费的时间,我发现 MatrixAddition 函数花费了我 60% 的时间。是否有任何替代方法来编写此函数,以减少我的运行时间。
时间秒秒呼叫毫秒/呼叫毫秒/呼叫名称
52.00 7.85 7.85 20 392.60 405.49 MatrixAddition(int, int, std::vector >&, int***, int***, int)
【问题讨论】:
-
三级间接可能会扼杀这个函数。如果您尝试不对缓存友好,那么恭喜,我认为您成功了。
-
您需要向我们展示您是如何分配这些数组的。如果您天真地做到了,那么正如@WhozCraig 所说,这不好。如果您分配了一个巨大的内存池并将指针指向该内存中的正确位置,那就是另一回事了。
-
将向量称为“列表”是个坏主意。就像将列表称为“向量”,将集合称为“地图”,或者将您的猫称为“狗”。
-
@user3704712 Here is a small example 将整个内存池(最后一次调用
new[])作为一个连续块分配,然后指向该内存池中的相关指针。请注意,只需要调用 3 次new[](以及 3 次调用delete[]以释放内存)。相反,如果您使用简单的三重嵌套循环来设置 3D 数组,您在每次迭代中调用new[],那么这会创建不连续的内存块,这会减慢处理速度。 -
@user3704712 这种分配方式正是你不应该做的。这是我所说的幼稚方法。
标签: c++ optimization gprof