мы пытаемся запустить два экземпляра cblas_dgemm параллельно. Если общее количество потоков равно 16, мы хотели бы, чтобы каждый экземпляр выполнялся с использованием 8 потоков. В настоящее время мы используем такую структуру:
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0){
cblas_dgemm(...);
}else {
cblas_dgemm(...);
}
}
Вот проблема:
На верхнем уровне есть два потока OpenMP, каждый из которых активен внутри одного из блоков if/else. Теперь мы ожидаем, что эти потоки будут вызывать функции cblas_dgemm параллельно, и внутри этих функций cblas_dgemm мы ожидаем, что будут порождены новые потоки.
Чтобы установить количество потоков, внутренних для каждого cblas_dgemm, мы устанавливаем соответствующую переменную среды: setenv OPENBLAS_NUM_THREADS 8 Однако, похоже, это не работает. Если мы измеряем время выполнения для каждого из параллельных вызовов, значения времени выполнения равны, но они равны времени выполнения одного вызова cblas_dgemm, когда вложенный параллелизм не используется и переменная среды OPENBLAS_NUM_THREADS установлена в 1.
Что происходит не так? и как мы можем иметь желаемое поведение? Можно ли как-то узнать количество потоков внутри функции cblas_dgemm?
Большое спасибо за ваше время и помощь