Я хочу, чтобы оптимизировать следующий код:накопление Оптимизация векторов для Монте-Карло моделирования
Во время моделирования методом Монте-Карло я аккумулировать некоторые количества f(x)
(f(x)
стоит дорого вычислить) и сохранить их в массиве bins
после каждой выборки шаг.
РЕДАКТИРОВАТЬ: Р (х) не является детерминированной функцией от х (я имею в виду он генерирует псевдо-случайных чисел и использует их, чтобы изменить результат), а также зависит от previoulsy расчетных значений F (Y)
for(int n=0;n<N;n++)
{
// compute some values f(x) at points "p"
for(auto k: p) bins[k] += f(k);
}
p.size()
намного меньше размера bins
, но в конечном итоге большинство элементов будет установлено.
После моделирования я аккумулировать свои конечные значения, делая взвешенную сумму по bins
(g
является поиск в другом массиве):
for(int l=0;l<M;l++)
for(int k=0;k<bins.size();k++)
finalResult[l] += g(k,l)*bins[k];
Я мог бы, конечно, вычислить мой обновленный finalResult
после каждого шага дискретизации, это однако замедляет работу программы, из-за цикла выше M
.
Я уже пробовал очень простой boost::accumulate
, но это не улучшило производительность (если я останусь с этим дизайном, мне придется использовать его в конечном итоге из-за стабильности, хотя).
Все массивы имеют тип Eigen::MatrixXd
, так как мне нужны они для операций BLAS.
p.size() < 10^2 N ~ 10^7 M ~ 10^4 bins.size() ~ 10^5
У вас есть какие-либо предложения, по которым методы могут быть полезны для оптимизации здесь?
метод вы используете внешний вид достаточно хорошо оптимизированы уже. Есть ли причина, почему вы ожидаете, что ее можно улучшить? Я бы вообще ожидал, что, полагая, что вы не делаете ничего глупого, как ненужное вычисление того же дорогостоящего значения два раза подряд, любые существенные улучшения должны были бы произойти от изменений высокого уровня к алгоритму моделирования Монте-Карло. –
алгоритм monte carlo уже сильно оптимизирован (имеется много матричных/векторных продуктов, которые не могут быть уменьшены). Профилирование его заявления показало, что это накопление занимает больше всего времени. так что я надеюсь, что я упустил некоторые менее очевидные оптимизации – Atom