Идентификация создания временного объекта в Eigen - PullRequest
0 голосов
/ 21 октября 2018

Поскольку документация в библиотеке Eigen C ++ указывает во многих местах, чтобы получить максимальную производительность с точки зрения времени вычислений, нам нужно по возможности избегать временных объектов.В моем приложении я имею дело с матрицами динамического размера.Я хотел бы знать создание временных матриц в моих расчетах.Существует ли какой-либо общий способ идентификации создания временных матриц?

Например,

Eigen::MatrixXf B, C, D;
....some initialization for B, C, D
Eigen::MatrixXf A = B*C+D;

Как проверить, сколько временных матриц создано при выполнении этой операции?

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать механизм плагинов для этого.Прежде чем включать любые собственные заголовки, определите следующее:

static long int nb_temporaries;
static long int nb_temporaries_on_assert = -1;
inline void on_temporary_creation(long int size) {
  // here's a great place to set a breakpoint when debugging failures in this test!
  if(size!=0) nb_temporaries++;
  if(nb_temporaries_on_assert>0) assert(nb_temporaries<nb_temporaries_on_assert);
}

#define EIGEN_DENSE_STORAGE_CTOR_PLUGIN { on_temporary_creation(size); }

Этот механизм используется в тестовом наборе в нескольких местах, наиболее заметно в product_notemporary.cpp.

Если вас больше всего беспокоит временное выделение памяти, вы также можете проверить это, скомпилировав с -DEIGEN_RUNTIME_NO_MALLOC и разрешив / запретив динамическое выделение с Eigen::internal::set_is_malloc_allowed(bool);

...