2016-08-29 2 views
1

Я работал над решением трехдиагональной системы с 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?»

+0

Я предполагаю, что вы ожидаете 'A.Solve (б)', которые будут осуществляться с использованием многопоточности? – slawekwin

+0

Да, в соответствии с Math.Net (который является только оболочкой собственного поставщика), если собственный поставщик (то есть MKL или OpenBLAS) использует несколько потоков, каждая операция, такая как Solve, Multiply и т. Д., Должна быть также многопоточной – 7raiden7

+0

Насколько велики ваши матрицы? Использование нескольких потоков эффективно только для больших систем, поэтому провайдеры линейной алгебры Math.NET используют только вызывающий поток на небольших матрицах. –

ответ

1

ЦП-модель (любые процессоры, x64 и т. Д.) Не имеет ничего общего с использованием ядер. Он просто определяет компилятор, если выходной код должен быть 32-битным, 64-битным или и тем, и другим.

Я думаю, метод Solve не используя многопоточность, но, возможно, вы можете выполнять тяжелую работу в течение нескольких нитей/ядер:

Попробуйте использовать Parallel.For-метод:

Parallel.For(0, 5000, n => x = A.Solve(b)); 

Это будет создать цикл for, но все итерации делятся на ядра машины.

ПРИМЕЧАНИЕ # 1: Поскольку ваш код является упрощенной версией, я надеюсь, что вы сможете перевести свой ответ на ваш фактический код, так как ваш пример просто повторяет ту же операцию 5000 раз.

ПРИМЕЧАНИЕ # 2: Если экземпляр A или b модифицирован методом Solve, это решение не будет работать, поскольку несколько потоков будут модифицировать эти объекты одновременно, что приведет к непредсказуемым результатам.

Источник: https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx

+0

Спасибо за ваш ответ. На самом деле да, все переменные зависят от предыдущей итерации цикла for, ergo, я не могу это точно распараллелить. Но я знаю (соглашаясь с документами Math.Net), что все операции с LA следует распараллеливать с использованием всех возможных ядер. – 7raiden7

+0

У вас есть источник? Где написано это заявление? –

+0

Из этого (https://github.com/mathnet/mathnet-numerics/commit/59c41819e6db31f99ddc988ddb429e4cb02b7853) Я вижу, что опция UseMultiThreading должна использовать все потоки даже для собственного провайдера – 7raiden7

Смежные вопросы