Сохранить результат разреженного mat-vec-mult в предварительно выделенный вектор - PullRequest
0 голосов
/ 14 января 2019

Я работаю над подпрограммой для разреженного умножения матрицы на вектор и хочу создать эталонный тест производительности с использованием библиотеки 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)). Есть ли способ сделать это?

С уважением.

1 Ответ

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

Попробуйте это:

y.noalias() = A * x;

noalias () указывает Eigen, что нет потенциальной проблемы с наложением псевдонимов (т. Е. Y не перекрывается с x), и что Eigen не должен создавать временный.

...