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

Вы не инициализировали a и b, только объявили их. Существует тонкая разница.

int a = 0;
int b = 0;

По крайней мере, это для C ++, я полагаю, что Java - это одна и та же концепция.

145
задан 2 revs, 2 users 84% 4 April 2014 в 21:49
поделиться

13 ответов

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

При использовании многопоточного ATLAS с C / C ++, Octave, Python и R потребовалось около 4 секунд.

При использовании Jama с Java потребовалось 50 секунд.

При использовании Colt и Parallel Colt с Java затраченное время составило 150 секунд!

При использовании JBLAS с Java затраченное время снова составило около 4 секунд, поскольку JBLAS использует многопоточный ATLAS.

Мне было ясно, что библиотеки Java работают не очень хорошо. Однако, если кому-то приходится писать код на Java, лучшим вариантом будет JBLAS. Джама, Кольт и Параллельный Кольт не быстрые.

97
ответ дан 23 November 2019 в 22:34
поделиться

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

2
ответ дан 3 revs 5 April 2014 в 08:49
поделиться
  • 1
    Кроме того, Вы говорите тот DRY doesn' t относятся к внешним ключам. Но в этом случае это делает, потому что я - " не repeating" столбцы адреса через несколько таблиц и вместо этого выламывания их к их собственной таблице. Это почти определение учебника DRY - удостоверяющийся, что, если изменение должно быть внесено, это сделано в одном месте, которое было моей целой целью в составлении таблицы этот путь. – Vince Fedorchak 4 October 2011 в 23:33

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

2
ответ дан Varkhan 5 April 2014 в 08:49
поделиться
  • 1
    Спасибо за подсказки. Вы говорите, что идентификация строки не достаточно хороша, но тогда Вы don' t предоставляют альтернативное решение. Вы подразумеваете, что мой первичный ключ должен быть сделан из комбинации столбцов в таблице, а не INT ИДЕНТИФИКАЦИОННЫХ ДАННЫХ? Как тогда я обратился бы к конкретному адресу в своих внешних ключах? – Vince Fedorchak 4 October 2011 в 23:29

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

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

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

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

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

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

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

7
ответ дан Neil Coffey 5 April 2014 в 08:49
поделиться
  • 1
    Я don' t рассматривают это как нормализацию, но существует некоторое преимущество в стандартизации - в том смысле, что основной дизайн таблицы адреса последователен для всего " addresses" и что, если конструктивное изменение происходит, это только должно быть сделано в одном месте. – Cade Roux 3 October 2011 в 20:36

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

3
ответ дан 4 revs, 2 users 85% 5 April 2014 в 08:49
поделиться
  • 1
    Теперь, когда I' m думающий об этом, возможно, другое решение состояло бы в том, чтобы добавить новый столбец к таблице Addresses и назвать его ChangedTo, который в конечном счете обратится к новой записи в таблице Address, если исходный адрес когда-либо изменялся. Это включило бы след, который покажет каждое обновление адреса назад к оригиналу (где ChangedTo является ПУСТЫМ). – Vince Fedorchak 3 October 2011 в 19:57

Matrix Tookits Java (MTJ) уже был упоминалось ранее, но, возможно, стоит упомянуть еще раз для всех, кто наткнулся на эту тему. Для тех, кто заинтересован, похоже, также идет разговор о том, чтобы MTJ заменила библиотеку linalg в apache commons math 2.0 , хотя я не уверен, как это продвигается в последнее время.

0
ответ дан 23 November 2019 в 22:34
поделиться

Я обнаружил, что если вы создаете много многомерных матриц, вы можете ускорить Jama примерно на 20%, если измените его так, чтобы он использовал одномерный массив вместо двухмерного. Это связано с тем, что Java не так эффективно поддерживает многомерные массивы. т.е. он создает массив массивов.

Colt уже делает это, но я обнаружил, что он сложнее и мощнее, чем Jama, что может объяснить, почему простые функции работают медленнее с Colt.

Ответ действительно зависит от того, насколько вы делаю. Джама не поддерживает то, что может сделать Кольт, что имеет большее значение.

1
ответ дан 23 November 2019 в 22:34
поделиться

Существует множество различных свободно доступных библиотек линейной алгебры Java. http://www.ujmp.org/java-matrix/benchmark/ К сожалению, этот тест дает вам информацию только об умножении матриц (с транспонированием теста не позволяет различным библиотекам использовать их соответствующие конструктивные особенности).

Вам следует обратить внимание на то, как эти библиотеки линейной алгебры работают, когда их просят вычислить различные матрицы разложения. http://ojalgo.org/matrix_compare.html

0
ответ дан 23 November 2019 в 22:34
поделиться

Также есть UJMP

1
ответ дан 23 November 2019 в 22:34
поделиться

Вы можете проверить проект jblas . Это относительно новая библиотека Java, которая использует BLAS, LAPACK и ATLAS для высокопроизводительных матричных операций.

Разработчик опубликовал несколько тестов , в которых jblas выгодно отличается от MTJ и Colt.

2
ответ дан 23 November 2019 в 22:34
поделиться

Я главный автор jblas и хотел бы отметить, что я выпустил версию 1.0 в конце декабря 2009 года. Я много работал над упаковкой, а это значит, что теперь можно просто скачать "жирную банку" с библиотеками ATLAS и JNI для Windows, Linux, Mac OS X, 32 и 64 bit (кроме Windows). Таким образом, вы получите природную производительность, просто добавив jar-файл к вашему клас-спату. Проверьте его по адресу http://jblas.org!

49
ответ дан 23 November 2019 в 22:34
поделиться

Вы должны добавить Apache Mahout в свой список покупок.

0
ответ дан 23 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

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