Высокопроизводительные многомерные массивы С++

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

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

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

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

  • хорошо сохранившаяся библиотека

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

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

  • Boost, который не поддерживает арифметику массивов и выглядит довольно медленным, по сравнению с Blitz ++.

  • Jonn Bowman array.h, у которого нет документации.

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

Ответ 1

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

Ответ 2

Существует широкий и относительно недавний опрос, в том числе контрольные показатели, здесь.

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

https://github.com/ndarray/ndarray

может стоить посмотреть.

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