矩阵运算的缓存优化

时间:2014-11-27 21:11:06

标签: c++ matrix cpu-cache

作为对积分函数的预计算,我需要在大型矩阵上进行一些计算。

for (size_t x = 1; x < size().x(); ++x)
for (size_t y = 0; y < size().y(); ++y)
for (size_t z = 0; z < size().z(); ++z)
    field::at(x, y, z) += field::at(x - 1, y, z);

for (size_t x = 0; x < size().x(); ++x)
for (size_t y = 1; y < size().y(); ++y)
for (size_t z = 0; z < size().z(); ++z)
    field::at(x, y, z) += field::at(x, y - 1, z);

for (size_t x = 0; x < size().x(); ++x)
for (size_t y = 0; y < size().y(); ++y)
for (size_t z = 1; z < size().z(); ++z)
    field::at(x, y, z) += field::at(x, y, z - 1);

我的字段会继承std::vector<size_t>,其中at被覆盖

T& at(size_t x, size_t y, size_t z)
{
    return container::at(x + y * size().x() + z * size().x() * size().y();
}

以下是我机器上的一些执行时间

  • (128x128x128)~250 ms
  • (256x256x256)~3秒
  • (512x512x512)~53秒

对我来说这看起来很慢。

问题

  • 分配大小为512x512x512(1G)的std::vector是个坏主意吗?我应该将它分成多个(512)子矢量,大小为512x512(每个2M)
  • 有没有其他方法可以进行相同的简单计算,从而提高缓存效率? (我猜测缓存故障是这么慢的原因)

0 个答案:

没有答案