Оптимизировать собственное выражение - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь оптимизировать код этого умножения:

A += s * (C + (D-U) * (D-U).transpose());

, где s - скаляр, C - матрица (обычно 10x10), D и Uвекторы.Я пытался с:

A.noalias() += s * (C + (D-U) * (D-U).transpose());

, но я думаю, что недостаточно читать документы .Какой лучший способ оптимизировать это выражение в eigen?

1 Ответ

0 голосов
/ 14 февраля 2019

Начните с вычисления D-U во временный вектор, чтобы он оценивался только один раз, а затем, поскольку ваши векторы крошечные, попробуйте заменить * на .lazyProduct(...).Точнее, в конечном итоге вы получите:

auto DU = (D-U).eval();
A.noalias() += s * (C + DU.lazyProduct(DU.transpose()));

Конечно, вы должны точно сопоставлять каждое изменение с включенной полной оптимизацией компилятора, чтобы убедиться, что они действительно эффективны и не производят непроизводительных результатов.

Наконец, если A и C симметричны, у вас может возникнуть желание обновить только одну половину A. Это будет иметь смысл для больших матриц (например,> 200x200), но, поскольку ваши матрицы довольно малы, это будет контрпродуктивноиз-за логической нагрузки и менее эффективной SIMD.

...