C/C++ по сравнению с Java/C# в высокоэффективных приложениях

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

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

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

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

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

  • упреждающая выборка памяти

  • не гарантируйте искажение памяти

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

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

Спасибо

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

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

11
задан 9 revs, 3 users 74% 23 June 2019 в 07:36
поделиться

3 ответа

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

Источник

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

2
ответ дан 3 December 2019 в 12:05
поделиться
0
ответ дан 3 December 2019 в 12:05
поделиться

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

1
ответ дан 3 December 2019 в 12:05
поделиться
Другие вопросы по тегам:

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