Я работал над решением трехдиагональной системы с Math.Net. Я установил MKL (x86) и расширение OpenBLAS, но, видимо, когда я вижу использование ЦП, я вижу только одно ядро. Это кодМногопоточные операции
MathNet.Numerics.Control.UseNativeMKL();
MathNet.Numerics.Control.UseMultiThreading();
Matrix<double> A;
Vector<double> x;
Vector<double> b;
// *** FILL A and B ***
for (int n = 0; n < 50000; n++)
x = A.Solve(b);
Это, конечно, значительно упрощенный вариант фактического кода, но ничего не помогает при использовании более 1 CPU.
Код скомпилирован в Release с включенными оптимизациями, и я попробовал оба «Любые процессоры» и «x64».
Я что-то не так?
[EDIT] забыл упомянуть, но А и Б может меняться в течение для цикла, Ergo, я не могу parallelise для цикла. Этот вопрос более ориентирован на «Как я могу заставить Math.Net использовать многопоточную оболочку своего провайдера LA?»
Я предполагаю, что вы ожидаете 'A.Solve (б)', которые будут осуществляться с использованием многопоточности? – slawekwin
Да, в соответствии с Math.Net (который является только оболочкой собственного поставщика), если собственный поставщик (то есть MKL или OpenBLAS) использует несколько потоков, каждая операция, такая как Solve, Multiply и т. Д., Должна быть также многопоточной – 7raiden7
Насколько велики ваши матрицы? Использование нескольких потоков эффективно только для больших систем, поэтому провайдеры линейной алгебры Math.NET используют только вызывающий поток на небольших матрицах. –