Я работаю над подпрограммой для разреженного умножения матрицы на вектор и хочу создать эталонный тест производительности с использованием библиотеки Eigen3. Я только хочу сравнить реальную арифметику без выделения памяти, участвующего в построении вектора результата. Как этого достичь?
Я пытался присвоить результат предварительно выделенному вектору, но Eigen::internal::set_is_malloc_allowed
показывает, что некоторое выделение памяти выполняется несмотря на все мои попытки.
// Setup multiplicands
const Eigen::SparseMatrix<double, Eigen::RowMajor> A = createMat();
const Eigen::VectorXd x = Eigen::VectorXd::Random(num_of_cols);
// Pre-allocate result vector
Eigen::VectorXd y = Eigen::VectorXd::Zero(num_of_rows);
Eigen::internal::set_is_malloc_allowed(false);
y = A * x; // <-- Runtime-error in debug mode
Eigen::internal::set_is_malloc_allowed(true);
То, что я ищу, - это, в основном, разновидность редкого умножения матрицы на вектор, которое берет ссылку на выходной буфер, в который записывается результат. Вместо y = A * x
в приведенном выше примере я бы написал что-то вроде matVecMult(A, x, std::begin(y))
. Есть ли способ сделать это?
С уважением.