Стоит ли использовать многопоточную реализацию blas наряду с многопроцессорной обработкой в Python?

#python #multithreading #numpy #multiprocessing #blas

#python #многопоточность #numpy #многопроцессорная обработка #blas

Вопрос:

Предположим, у меня 16-ядерная машина и смущающе параллельная программа. Я использую множество точечных продуктов numpy и добавляю массивы numpy, и если бы я не использовал многопроцессорную обработку, это было бы проще простого: убедитесь, что numpy построен на версии blas, которая использует многопоточность. Тем не менее, я использую многопроцессорную обработку, и все ядра постоянно работают. В этом случае есть ли какая-либо польза от использования многопоточного blas?

Большинство операций (blas) относятся к типу 1, некоторые — к типу 2.

Ответ №1:

Возможно, вам следует быть немного осторожным в предположении, что в вашем коде фактически используются многопоточные вызовы BLAS. Относительно немногие операторы numpy фактически используют базовые BLAS, и относительно немногие вызовы BLAS на самом деле многопоточны. numpy.dot использует либо BLAS dot , gemv либо gemm , в зависимости от операции, но из них только gemm обычно многопоточный, потому что при этом редко наблюдается какое-либо преимущество в производительности для вызовов O (N) и O (N ^ 2) BLAS. Если вы ограничиваете себя операциями BLAS уровня 1 и уровня 2, я сомневаюсь, что вы на самом деле используете какие-либо многопоточные вызовы BLAS, даже если вы используете реализацию numpy, созданную с многопоточным BLAS, например Atlas или MKL.

Комментарии:

1. Меня интересуют источники, объясняющие это поведение, если вы знаете какой-нибудь интернет-документ об этом…

2. Очевидным источником является сам код numpy. Помимо этого, Клинт Уэйли (автор Atlas, ранее из UTK) и Кадзусигэ Гото (автор GotoBLAS, ранее из TACC) написали и опубликовали ряд проектных документов и научных работ об их реализациях BLAS и их производительности.

Ответ №2:

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

В зависимости от вашего алгоритма и того, что вы делаете, может быть выгоднее использовать один тип над другим, но это очень зависит.

Комментарии:

1. Возможно, я что-то недопонимаю, но у меня создалось впечатление, что одно процессорное ядро может эффективно использовать несколько потоков. Таким образом, вы можете получить ускорение на одноядерной машине.

2. Я не эксперт в многопроцессорной обработке / многопоточности (пока!), Но, насколько я понимаю, если один процессор работает с максимальной нагрузкой, добавление дополнительных потоков приведет только к увеличению накладных расходов на обмен между ними. Если нет специальной архитектуры, помогающей обрабатывать другие потоки во время работы (скажем, другого ядра?) никакого увеличения производительности не произойдет. Если все ядра загружены максимально, и если вы разделите одно и то же задание на небольшие фрагменты, все они по-прежнему будут загружены максимально. Добавление потоков к одноядерной машине полезно, когда ядро ожидает, когда что-то произойдет.