Как использовать 2d массив переменного размера для работы с Eigen? - PullRequest
0 голосов
/ 10 марта 2020

Я делаю это на C ++ 11 или новее для приложения, использующего умножение матриц на одну машину.

Размер двумерной матрицы необходимо определить во время выполнения для матриц разных размеров. Поэтому его нельзя жестко закодировать как глобальную переменную.

Вот список возможных вариантов, о которых я могу подумать:

1. std::array
2. std::vector
3. statically-allocated array on stack
4. dynamically-allocated array on heap(with new?) 
5. use Eigen built-in matrix representation from the beginning(avoid casting back and forth when using option 1- option 4 )

Продолжение: что, если размер матриц может быть помещен в стек? Я думаю о варианте 3, так как он быстрее, чем вариант 4, когда требуется несколько выделений памяти.

1 Ответ

1 голос
/ 10 марта 2020

Статически распределенный массив работает лучше всего, поскольку выделение памяти относительно дорого. На практике все еще можно использовать для этой цели массив, выделенный в куче, если вы можете использовать его без необходимости дальнейшего освобождения и выделения.

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

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

В общем, вы все равно должны делать тесты и сравнивать ваши результаты другими методами.

...