Ограничение ядер процессора перед многопроцессорностью в python - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть программа, которая требует многопроцессорной обработки. Функция, которую она вызывает, будет автоматически использовать каждое доступное ядро. Однако это как-то вызывает проблему, поскольку каждое ядро ​​используется для каждого из процессов, а это означает, что каждое ядро ​​имеет нагрузку 100 * x%, где x - количество порожденных процессов. Таким образом, для 6 процессов каждая рана используется на 600%.

Код довольно прост и использует обычный:

pool = Pool(processes=6)
for i in pool.imap_unordered(main_program, range(100)):
    print('Task in pool has finished')

Это, однако, приведет к загрузке каждого ядра на 600% и будет медленнее, чем каждый процесс в отдельности. Я предполагаю, что я использую модуль mp неправильно, но я не могу понять, где.

Примечание. Мое идеальное решение - ограничить основную функцию использованием только одного ядра, однако эта функция не мое, а скорее приложение, которое я вызываю, и я не знаю, где ограничить это в исходном коде.

Есть предложения?

Большое спасибо

1 Ответ

0 голосов
/ 08 апреля 2020

Я нашел ответ здесь

По сути, функции BLAS (я подозреваю, numpy) мешали моей многопроцессорной обработке. Это исправлено:

os.environ["OMP_NUM_THREADS"] = "1" # export OMP_NUM_THREADS=1
os.environ["OPENBLAS_NUM_THREADS"] = "1" # export OPENBLAS_NUM_THREADS=1
os.environ["MKL_NUM_THREADS"] = "1" # export MKL_NUM_THREADS=1
os.environ["VECLIB_MAXIMUM_THREADS"] = "1" # export VECLIB_MAXIMUM_THREADS=1
os.environ["NUMEXPR_NUM_THREADS"] = "1" # export NUMEXPR_NUM_THREADS=1
...