Как я могу более точно контролировать количество потоков, используемых для каждого вызова ядра BLAS на ЦП?

Я пишу код OpenMP, вызывающий разные ядра BLAS, в основном DGEMM разных размеров, в разных потоках. Чтобы максимизировать производительность, я хочу контролировать количество потоков, которые я вызываю для каждого BLAS. Кажется, что это очень очевидная основная потребность, хотя это очень трудно сделать.

В OpenBLAS есть функция openblas_set_num_threads(int n), в файле README кода OpenBLAS описано, что

Они используются только один раз при инициализации библиотеки и недоступны для точной настройки номеров потоков в отдельных вызовах BLAS.

Так что я не могу использовать эту функцию в OpenBLAS.

В MKL есть функция mkl_set_num_threads_local(int nt), которая кажется ответом на мой вопрос, когда я использую MKL.

Есть ли способ настроить количество потоков для каждого вызова BLAS независимо от используемой библиотеки? (идеальный выбор) Если нет, то только ли MKL позволяет мне настраивать количество потоков?


person Aznaveh    schedule 05.01.2021    source источник
comment
Вы все же пытались использовать openblas_set_num_threads? Я действительно не понимаю смысла предложения в README, но было бы странно иметь эту функцию и не иметь возможности использовать ее во время выполнения. Это stackoverflow.com/a/29582987/5769463 предполагают, что функция работает так, как вы хотели бы ее использовать.   -  person ead    schedule 11.01.2021
comment
Я пытался использовать его. Я сам не уверен, но кажется, что он сильно отличается от mkl.   -  person Aznaveh    schedule 11.01.2021