оптимизация кеша матричной операции

В качестве предварительного вычисления для интегральной функции мне нужно сделать некоторые вычисления на большой матрице.

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 мс
  • (256x256x256) ~ 3 сек
  • (512x512x512) ~ 53 сек

Это выглядит очень медленно для меня.

Вопрос

  • Выделяет std::vector размером 512x512x512 (1G) плохая идея? Должен ли я разделить его на несколько (512) субвектор размера 512×512 (2M / каждый)
  • Есть ли другой способ сделать то же самое простое вычисление, которое было бы более эффективным кеш? (Я предполагаю, что ошибки кэша являются причиной, почему это так медленно)

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector