C / C ++ против Java / C # в высокопроизводительных приложениях - PullRequest
11 голосов
/ 28 февраля 2010

Мой вопрос касается производительности Java по сравнению со скомпилированным кодом, например, C ++ / fortran / assembly в высокопроизводительных числовых приложениях. Я знаю, что это спорная тема, но я ищу конкретные ответы / примеры. Также сообщество вики. Я задавал подобные вопросы и раньше, но, думаю, я выразился в общих чертах и ​​не получил ответов, которые искал.

Умножение матрицы на матрицу двойной точности, широко известное как dgemm в библиотеке blas, позволяет достичь почти 100-процентной пиковой производительности ЦП (с точки зрения числа операций в секунду). Есть несколько факторов, которые позволяют достичь этой производительности:

  • блокировка кеша для достижения максимальной локализации памяти

  • развертывание цикла для минимизации накладных расходов на управление

  • векторных инструкций, таких как SSE

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

  • гарантия отсутствия псевдонимов памяти

Я видел множество тестов, использующих ассемблер, C ++, Fortran, Atlas, поставщик BLAS (типичные случаи - матрица измерения 512 и выше). С другой стороны, я слышал, что основные байтовые скомпилированные языки / реализации, такие как Java, могут быть быстрыми или почти такими же быстрыми, как машинно-компилируемые языки. Однако я не видел определенных ориентиров, показывающих, что это так. Напротив, кажется (из моего собственного исследования) скомпилированные байты языки намного медленнее.

У вас есть хорошие тесты умножения матриц-матриц для Java / C #? может ли компилятор точно в срок (фактическая реализация, а не гипотетическая) генерировать инструкции, которые удовлетворяют перечисленным пунктам?

Спасибо

в отношении производительности: каждый процессор имеет пиковую производительность, в зависимости от количества команд, которые процессор может выполнять в секунду. Например, современный процессор Intel с частотой 2 ГГц может достигать 8 миллиардов с двойной точностью добавления / умножения в секунду, что приводит к пиковой производительности 8 Гфлопс. Матрица-матричное умножение является одним из алгоритмов, который способен достичь почти полной производительности в отношении количества операций в секунду, основной причиной является более высокое соотношение вычислений к операциям с памятью (N^3/N^2). Числа меня интересуют, что-то на заказ N > 500.

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

Ответы [ 5 ]

2 голосов
/ 28 февраля 2010

Сравнение VC ++ /. NET 3.5 / Mono 2.2 в сценарии умножения чистой матрицы:

Источник

Mono с Mono.Simd имеет большое значение для сокращения разрыва в производительности с оптимизированным вручную C ++, но версия C ++ по-прежнему явно самая быстрая. Но Mono сейчас на уровне 2.6 и может быть ближе, и я ожидаю, что если .NET когда-нибудь получит что-то вроде Mono.Simd, он может быть очень конкурентоспособным, поскольку между .NET и последовательным C ++ нет большой разницы.

1 голос
/ 28 февраля 2010

Все факторы, которые вы укажете, возможно, выполняются путем ручной оптимизации памяти / кода для вашей конкретной задачи. Но JIT-компилятору не хватает информации о вашем домене, чтобы сделать код оптимальным, как вы делаете это вручную, и можете применять только общие правила оптимизации. В результате код C / C ++ будет работать медленнее (но при желании может использовать 100% ЦП):

0 голосов
/ 05 февраля 2019

в чистом математическом сценарии (вычисление 25 типов или трехмерных координат алгебраических поверхностей) c ++ превосходит Java в соотношении 2,5

0 голосов
/ 22 июня 2013

Java не может конкурировать с C в умножении матриц, одной из причин является то, что она проверяет при каждом доступе к массиву, превышены ли границы массива. Кроме того, математика Java медленная, она не использует процессор sin (), cos ().

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