MathNet.Numerics не использует собственный провайдер Mkl

У меня есть проект F#, который использует MathNet.Numerics для процедур линейной алгебры.

Я поместил следующий код в модуль F#:

module LinearAlgebra

open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra.Double
open MathNet.Numerics.LinearAlgebra.Generic

Control.LinearAlgebraProvider <- new Algorithms.LinearAlgebra.Mkl.MklLinearAlgebraProvider()

Но время, которое я вижу для умножения матриц, остается неизменным независимо от того, включена ли эта строка кода или закомментирована.

Я установил пакет NuGet поставщика Mkl, как описано здесь: http://christoph.ruegg.name/blog/mathnet-numerics-with-native-linear-алгебра.html

и убедитесь, что эти две библиотеки dll скопированы в каталог bin: libiomp5md.dll MathNet.Numerics.MKL.dll

Любые идеи о том, как я могу определить, действительно ли используется собственный провайдер?


person JTS    schedule 31.05.2014    source источник


Ответы (1)


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

  • Насколько велики ваши матрицы?
  • Все ли задействованные матрицы плотны?
  • Является ли этот модуль модулем, в котором находится ваш код линейной алгебры? Если нет, то убедились ли вы, что этот модуль действительно выполняется — перед кодом линейной алгебры?

Вы можете убедиться, что собственный провайдер включен, проверив Control.LinearAlgebraProvider прямо перед выполнением кода линейной алгебры. В версии 3 вызов ToString предоставит некоторую дополнительную информацию, такую ​​как платформа и версия.

person Christoph Rüegg    schedule 31.05.2014
comment
Матрицы бывают 4000х430 и 430х430. Я использую только плотные матричные типы, хотя некоторые из них имеют разреженную структуру. Как я понял, sparse пока не работает с нативными провайдерами. Так что если я задаю MklProvider в модуле, где производятся расчеты, он работает. Но если я установлю его в другом модуле и импортирую этот модуль, он не сработает. Поэтому я завернул вызов для установки провайдера в функцию инициализации и вызываю ее после открытия модуля, и это также работает. Должно быть что-то о модулях F #, о которых я не знаю. - person JTS; 01.06.2014
comment
Спасибо за обновления. Да, добавление разреженной поддержки к собственному провайдеру MKL было отложено до второстепенного выпуска после версии 3.0. - person Christoph Rüegg; 01.06.2014
comment
Нашел причину, по которой оператор верхнего уровня в открытом модуле не работал. У меня были только встроенные функции в модуле, поэтому он никогда по-настоящему не открывался до использования поставщика линейной алгебры. - person JTS; 01.06.2014
comment
Кстати, большое спасибо команде MathNet за эту библиотеку. - person JTS; 01.06.2014