Подтвердить что ты не робот

Мне нужна более быстрая математика с плавающей запятой для .NET С# (для умножения и деления больших массивов)

Мне нужен самый быстрый способ умножить и разделить большие массивы данных.

Я читал это (написал Бен Фойгт здесь):

.NET не использует MMX или SSE или AVX, начиная с текущей версии

(...)

современные компиляторы С++ не только позволяют использовать SIMD, но и могут автоматически прорисовывать обычный код в инструкции SIMD

.

Думаю, мне нужно:

  • Поддержка SSE с векторными операциями (для одновременного умножения 4 поплавков)

  • поддержка многопоточности (решение/библиотека, которая каким-то образом не столкнется с потоком С#)

Есть ли библиотека /dll, которую я могу использовать?

Изменить: любые альтернативы для Octave? Я занимаюсь только двумя операциями: разделите, умножьте. Если я правильно понял, что такое Octave и как он работает, мне нужно будет разобрать вывод... Он не может быть быстрым...


В соответствии с "что вы пробовали" и "почему вы не хотите использовать простой for":

Мне нужно это для обучения нейронной сети. Сеть (сейчас) имеет более 50 входов, многие нейроны (каждый 50+ весов). Данные обучения содержат более 100 000 строк, по 50 полей. Каждому входу нейрона требуется несколько (не менее 5) операций умножения.

Я понятия не имею, сколько учебных тем мне нужно, но я попытался сравнить только операции умножения, и я получил результат: около 16 секунд в эпоху на моем процессоре Intel Core Duo T2500 2.0 ГГц.

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

4b9b3361

Ответ 1

Когда я увидел этот вопрос, я искал способы использования библиотек GOTO BLAS в С#. Библиотеки GOTO (названные в честь автора, а не злого слова программирования) широко считаются самыми быстрыми библиотеками линейных алгебр на основе ЦП, поскольку они написаны талантливым кодером, который настраивает библиотеку на языке ассемблера для каждой конкретной архитектуры процессора (Opteron, Xeon, и т.д.)

Оказывается, что Math.NET Numerics, вероятно, вы хотите.

Из Описание MSDN:

Math.NET Numerics стремится стать стандартной математической библиотекой с открытым исходным кодом для .NET Framework. Он предоставляет методы и алгоритмы для численных расчетов в науке, технике и повседневном использовании. Функциональность, охватываемая Math.NET Numerics, включает специальные функции, линейную алгебру, вероятностные модели, статистику, случайные числа, интерполяцию и интегральные преобразования (FFT). Math.NET Numerics обеспечивает полностью управляемую реализацию, которая работает на .NET 4.0, Silverlight 4 и Mono (но может быть скомпилирована для других платформ). Он также обеспечивает параллельную управляемую реализацию и поддерживает оптимизацию с использованием собственных библиотек BLAS/LAPACK (GotoBLAS, Intel MKL и AMD ACML).

Ответ 2

Предполагая, что ваши векторы представляют собой гигантские N-мерные массивы/векторы

Если бы я использовал язык Slow, такой как С#, и мне хотелось умножить и разделить огромные массивы и сделать это как можно быстрее, используя все процессоры, у меня был бы интерфейс С# с GNU Octave. Октава GNU - это векторизованный язык, поэтому умножения матрицы используют на порядок меньше ресурсов, чем вложенные для циклов.

Итак, вы бы определили некоторые пользовательские скрипты в GNU Octave, чтобы умножить два 50-мерных массива вместе, тогда вы С# вызываете октаву и передаете ей параметры. Затем получим С# результаты.

GNU Octave был разработан, чтобы использовать каждый трюк в книге, чтобы сделать расчеты по матрице максимально возможными и полными как можно более быстрыми ресурсами.

http://en.wikibooks.org/wiki/Octave_Programming_Tutorial/Getting_started

Кто-то еще спросил, как связать С# с Octave:

Взаимодействие октавы с С#

Изменить: Выполнение всей этой дополнительной работы не имеет смысла, если расчеты не превышают 10 минут, и очень важно уменьшить время обработки.

Ответ 3

Я нашел что-то вроде этого: Microsoft Research Accellerator v2

Акселератор - это параллельная библиотека данных высокого уровня, которая использует параллельные процессоры, такие как GPU или многоядерный процессор, для ускорения выполнения.

Интересные функции (вставка с сайта M $):

  • Выполнение многоядерных процессоров, как 32, так и 64 бит, в дополнение к графическим процессорам DX9 и CUDA.
  • Возможность выполнения на нескольких устройствах в одном экземпляре Accelerator

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

Ответ 4

Если вы можете позволить запустить его с помощью Mono, альтернативной среды исполнения с открытым исходным кодом для .NET, вы можете использовать Mono.Simd(http://docs.go-mono.com/index.aspx?link=N: Mono.Simd), что делает SIMD доступным вокруг структур, но только в Mono, где JIT встрояет метод в операции SIMD.