Cra sh в Eigen при работе со смешанными мажорными / кол-мажорными разреженными матрицами - PullRequest
0 голосов
/ 10 марта 2020

Я получаю cra * sh в Eigen 3.3.5 при попытке сделать что-то вроде следующего:


Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> eigenValues(valueBuffer, 1, 100000);

Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> eigenChannels(channelBuffer, 1, 5000);

Eigen::SparseMatrix<float, Eigen::RowMajor> sparseChannels = eigenChannels.sparseView(1.0f, 1.e-4f);

Eigen::Map<const Eigen::SparseMatrix<float>> eigenLargeSparseMatrix(5000, 100000, LargeSparseMatrix.Values.Num(), LargeSparseMatrix.OuterStarts.GetData(), LargeSparseMatrix.InnerIndices.GetData(), LargeSparseMatrix.Values.GetData());

eigenValues += (sparseChannels * eigenLargeSparseMatrix);

В частности, это происходит сбой в Eigen :: internal :: sparse_sparse_to_dense_product_impl во внутреннем l oop при попытке получить индекс lhsIt.

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

В основном все, что я пытаюсь сделать, это делать:

1xn вектор-строки + = (1xm вектор-строки * матрица mxn)

, где левая сторона плотная, а обе правой стороны / матрицы невелики.

То, что происходит при взгляде на Шаблонный callstack - это add_assign_op, который правильно распознает, что вектор строки имеет флаг RowMajor, а матрица - ColMajor, но тогда sparse_sparse_to_dense_product_impl имеет как lhs, так и rhs, являющиеся ColMajor.

Из-за просмотра кода sparse_sparse_to_dense_product_selector это происходит потому, что Eigen просто изменяет lhs RowMajor на ColMajorLhs и вызывает impl продукта. Это кажется обязательным для cra sh - это вектор строки по причине, я не уверен, почему eigen находит необходимость транспонировать его. Я действительно не уверен, как это означает работать.

Моя задача заключается в том, что мне нужна (для повышения эффективности потоковой памяти) более крупная матрица, которая должна быть организована последовательно в памяти таким образом, чтобы: предварительно умноженный на вектор строки, или б) его основной ряд и после умножения на вектор столбца. Обе версии поражают этот странный транспонированный код, а не просто позволяют им быть разными.

Кто-нибудь может протянуть руку? Я делаю что-то неправильно? Это ошибка?

ДОБАВЛЕНО: Я уверен, что cra sh - это моя собственная ошибка, в конце концов, но я все же хотел бы понять, почему вектор строки транспонируется до того, как умножить, как я предполагаю, это приведет к нежелательному поведению. На данном этапе мне просто хотелось бы понять, почему sparse_sparse_to_dense_product_selector транспонирует векторы строк в векторы столбцов перед умножением.

...