Высокопроизводительные многомерные массивы C ++ - PullRequest
13 голосов
/ 18 октября 2010

Я ищу совет относительно высокопроизводительных библиотек / классов многомерных массивов для C ++.Что мне действительно нужно:

  • возможность динамически распределять массивы с размером, определенным во время выполнения

  • возможность доступа и изменениязначения одного массива (быстрые)

  • , чтобы можно было использовать простую арифметику массива, такую ​​как array1 = array2 + 2 * array3

  • хорошо поддерживаемая библиотека

Я сталкивался с различными библиотеками, в том числе:

  • Blitz ++ , который выглядит именно то, что мне нужно, но который не 'Кажется, что он очень хорошо поддерживается (последний стабильный выпуск был 5 лет назад)сказать Blitz ++.

  • Jonn Bowman's array.h , который не имеет документации.

Есть ли у кого-нибудь другие предложенияили комментарии по поводу вышеуказанных вариантов?

Ответы [ 8 ]

6 голосов
/ 13 января 2012

Eigen находится в очень хорошем состоянии (сейчас, по крайней мере, новые версии выходят каждый месяц) и поддерживает другие необходимые операции.

3 голосов
/ 18 октября 2010

Существует широкое и относительно недавнее исследование, включая эталонные тесты, здесь .

Я считаю, что вы можете ускорить Boost.UBlas, привязав его к базовым числовым библиотекам, таким как LAPACK или Intel MKL, но не сделали этого.Чаще всего в качестве кандидатов выступают Boost.UBlas и MTL.По моему опыту, широкое внедрение будет способствовать дальнейшей поддержке и развитию.

2 голосов
/ 08 мая 2015

Necomi , по-видимому, предоставляет необходимые функции.

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

2 голосов
/ 18 октября 2010
  • uBlas , часть Boost. Он предлагает полный уровень BLAS 1-3 и, следовательно, множество арифметических функций массива.
  • Armadillo также представляется библиотекой линейной алгебры C ++, которая, насколько я вижу, может использовать LAPACK / Atlas (что, конечно, делает ее канонически быстрой).
  • Научная библиотека GNU предлагает полный BLAS. Я не знаю, как это быстро, или если он может использовать LAPACK / Atlas.
  • Если вам не нужно ничего более причудливого, чем то, что вы перечислили, вы можете легко обернуть, например, Atlas 'BLAS самостоятельно. Но вы, вероятно, не хотите изобретать велосипед, если вам не нужно.
1 голос
/ 03 марта 2015

Также еще одна бесстыдная самореклама,

https://github.com/dwwork/FortCpp/

Я разместил свое собственное решение этой проблемы на GitHub.Я ни в коем случае не эксперт по С ++, но я думал, что по крайней мере выложу это.

0 голосов
/ 12 ноября 2012

С оговоркой, что это бесстыдная самореклама,

https://github.com/ndarray/ndarray

может стоить изучить.

Хотя она не обеспечивает оптимизированные математические операторыэто обеспечивает интерфейс для Eigen для этого.Что действительно выгодно, так это обеспечение взаимодействия с Python / NumPy через SWIG или Boost.Python.

0 голосов
/ 24 августа 2012

С точки зрения производительности я попробовал boost :: MultiArray и Armadillo.Ни один из них не был быстрым, поскольку оба имели медленное время доступа по сравнению с массивами или векторами, и я смог превзойти эти пакеты в такой операции, как x1 (4:10) = x2 (1: 6) + x2 (2: 7)+ x2 (3: 8) с помощью простого цикла с ручным кодированием (я уверен, что с помощью оптимизации моего компилятора).Когда вы попадаете в матричное умножение, эти пакеты могут предложить некоторые преимущества через LAPACK и BLAS, но вы всегда можете использовать эти интерфейсы самостоятельно.

0 голосов
/ 18 октября 2010

Может быть, такая библиотека, как BLAS, CBLAS существует, но не помню где.

http://www.netlib.org/blas/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...