Производительность математических библиотек Java? [закрыто]

Мы вычисляем что-то, чье время выполнения связано с матричными операциями. (Ниже приведены некоторые подробности, если они интересны.) Этот опыт вызвал следующий вопрос:

Есть ли у людей опыт работы с библиотеками Java для математической математики (например, умножение, обратное и т. Д.)? Например:

Я искал и ничего не нашел.


Подробности нашего сравнения скоростей:

Мы используем Intel FORTRAN (ifort (IFORT) 10.1 20070913). Мы повторно реализовали его в Java (1.6), используя Apache Commons Math 1.2 Matrix Ops, и он согласен со всеми его цифрами точности. (У нас есть причины желать этого в Java.) (Java удваивается, Fortran real * 8). Фортран: 6 минут, Java 33 минуты, та же машина. Профилирование jvisualm показывает много времени, проведенного в RealMatrixImpl. {getEntry, isValidCoordinate} (который, похоже, ушел в невыпущенные Apache commons math 2.0, но 2.0 не быстрее). Fortran использует процедуры Atlas BLAS (dpotrf и т. Д.).

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

В некоторых других вычислениях, в которых не используются библиотеки, Java работала не намного медленнее, а иногда и намного быстрее.

146
задан 19.05.2020, 01:32

5 ответов

Построение на сообщении Varkhan, что определенный для Pentium собственный код добился бы большего успеха:

2
ответ дан 19.05.2020, 01:35
  • 1
    Кроме того, Вы говорите тот DRY doesn' t относятся к внешним ключам. Но в этом случае это делает, потому что я - " не repeating" столбцы адреса через несколько таблиц и вместо этого выламывания их к их собственной таблице. Это почти определение учебника DRY - удостоверяющийся, что, если изменение должно быть внесено, это сделано в одном месте, которое было моей целой целью в составлении таблицы этот путь. – Vince Fedorchak 04.10.2011, 15:33

Вы смотрели на Математическая Библиотека Ядра Intel ? Это утверждает, что превзошло по характеристикам даже ATLAS. MKL может быть используется в Java через обертки JNI.

3
ответ дан 19.05.2020, 01:36
  • 1
    Теперь, когда I' m думающий об этом, возможно, другое решение состояло бы в том, чтобы добавить новый столбец к таблице Addresses и назвать его ChangedTo, который в конечном счете обратится к новой записи в таблице Address, если исходный адрес когда-либо изменялся. Это включило бы след, который покажет каждое обновление адреса назад к оригиналу (где ChangedTo является ПУСТЫМ). – Vince Fedorchak 03.10.2011, 22:57
  • 2
    +1, Если it' s скорость you' поиск ре, это, кажется, способ пойти – Gab Royer 19.05.2020, 01:36
  • 3
    @dfrankow: I' ve обновил мой ответ для обращения к беспокойству при использовании его в Java. – Zach Scrivena 19.05.2020, 01:37
  • 4
    У нас есть это. a) Его лицензирование более строго, чем Атлас (так мы can' t используют все наши компьютеры); b) it' s не Java (и поскольку я сказал, что у нас есть причины хотеть быть в Java). – dfrankow 19.05.2020, 01:38
  • 5
    т.е. это не ответ на мой вопрос о библиотеках Java (но я don' t имеют репутацию к downvote это). – dfrankow 19.05.2020, 01:38

Мы использовали КОЛЬТ для некоторых довольно больших серьезных финансовых вычислений и были очень довольны им. В нашем в большой степени представленном коде мы почти никогда не должны были заменять реализацию КОЛЬТА одним собственным.

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

3
ответ дан 19.05.2020, 01:39
  • 1
    Вы повторение внешнего ключа; you' ре, просто повторяющее целое число вместо текста. Когда внешний ключ является значимым текстом, ON UPDATE CASCADE позволяет Вам обновить значение в единственном месте, если Ваша DBMS doesn' t поддерживают ту функцию. (Oracle doesn' t.), Но когда you' ре, имеющее дело с адресами, обычно необходимо проявлять дополнительную заботу к , избегают обновление некоторых видов исторических данных, как адреса на счетах и счетах. И that' s верный независимо от того, является ли Ваш внешний ключ текстом или целым числом. – Mike Sherrill 'Cat Recall' 04.10.2011, 16:11

Код Linalg, который полагается в большой степени на Pentiums и векторные вычислительные возможности более поздних процессоров (запускающийся с расширений MMX, как LAPACK и теперь Атлас BLAS) "фантастически не оптимизирован", но просто промышленный стандарт. Для тиражирования той производительности в Java, Вы испытываете необходимость в собственных библиотеках. У меня была та же проблема производительности, как Вы описываете (главным образом, чтобы смочь вычислить разложения Choleski) и ничто не нашли действительно эффективным: Jama является чистым Java, так как он, как предполагается, просто шаблон и ссылочный набор для реализаторов для следования..., которого никогда не происходило. Вы знаете математическое свободное городское население Apache... Что касается КОЛЬТА, я должен все еще протестировать его, но это, кажется, полагается в большой степени на улучшения Ниндзя, большинство которых было достигнуто путем создания специального компилятора Java, таким образом, я сомневаюсь, что это собирается помочь. В той точке я думаю, что нам "просто" нужно коллективное усилие создать собственный компонент реализация Jama...

2
ответ дан 19.05.2020, 01:41
  • 1
    Спасибо за подсказки. Вы говорите, что идентификация строки не достаточно хороша, но тогда Вы don' t предоставляют альтернативное решение. Вы подразумеваете, что мой первичный ключ должен быть сделан из комбинации столбцов в таблице, а не INT ИДЕНТИФИКАЦИОННЫХ ДАННЫХ? Как тогда я обратился бы к конкретному адресу в своих внешних ключах? – Vince Fedorchak 04.10.2011, 15:29
  • 2
    Положительная сторона! Этапный альфой проект с обертками JNI для Атласа: jblas.org . Author' s сообщение в блоге: mikiobraun.blogspot.com/2008/10/… – dfrankow 19.05.2020, 01:42

Я не могу действительно прокомментировать определенные библиотеки, но в принципе существует мало причины таких операций, чтобы быть медленнее в Java. Горячая точка обычно делает виды вещей, которые Вы ожидали бы, что компилятор сделает: это компилирует основные математические операции на переменных Java к соответствующим машинным командам (это использует инструкции SSE, но только один на операцию); доступы к элементам массива компилируются для использования "необработанных" инструкций MOV, как Вы ожидали бы; это принимает решения о том, как выделить переменные регистрам, когда это может; это переупорядочивает инструкции использовать в своих интересах архитектуру процессора... Возможное исключение - то, что, поскольку я упомянул, Горячая точка только выполнит одну операцию на инструкцию SSE; в принципе у Вас могла быть фантастически оптимизированная матричная библиотека, которая выполнила несколько операций на инструкцию, хотя я не знаю, делает ли, скажем, Ваша конкретная библиотека FORTRAN так или если такая библиотека даже существует. Если это делает, в настоящее время нет никакого пути к Java (или по крайней мере, Горячая точка) для конкуренции с тем (хотя Вы могли, конечно, записать свою собственную собственную библиотеку с теми оптимизациями для вызова от Java).

Поэтому, что все это означает? Хорошо:

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

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

7
ответ дан 19.05.2020, 01:42
  • 1
    Я don' t рассматривают это как нормализацию, но существует некоторое преимущество в стандартизации - в том смысле, что основной дизайн таблицы адреса последователен для всего " addresses" и что, если конструктивное изменение происходит, это только должно быть сделано в одном месте. – Cade Roux 03.10.2011, 23:36

Теги

Похожие вопросы