Как функция omp_set_num_threads()
OpenMP влияет на две одновременные операции OpenMP? Количество потоков кумулятивное или жесткое ограничение?
Например, предположим, что два рабочих потока одновременно попадают в следующий блок кода
omp_set_num_threads(4);
#pragma omp parallel for shared(n)
for (int i=0; i<n; i++)
{
// ... some complicated, parallelizable math here...
}
Получит ли каждая операция свои 4 потока (всего 8) или будет разделено 4 потока между двумя одновременными операциями?
(Я предполагаю, что поведение, каким бы оно ни было, было бы идентичным, если бы я использовал переменную среды OMP_NUM_THREADS или предложение num_threads
. Если я ошибся, скажите, пожалуйста ...)
Я спрашиваю, потому что у меня есть клиент, использующий мой SDK на машине с целыми лот-ядрами. Ему нужно сделать много вызовов одной из моих функций SDK, которая реализована с помощью OpenMP. (Я не написал это. Я унаследовал это). Он хотел поэкспериментировать с распараллеливанием своих вызовов этой функции в поисках более быстрой общей пропускной способности. И у него уже есть возможность контролировать аргумент, который мой код использует для omp_set_num_threads()
.
Я понял, что недостаточно осведомлен, чтобы посоветовать ему, какое значение номера потока использовать или даже если параллелизация (поверх реализации OpenMP) - это стоящий путь для изучения. Поэтому я хотел бы хотя бы понять, что OpenMP должен делать в этом случае, прежде чем начинать свои собственные тесты.
Если это имеет значение, я использую Open MP в Visual Studio 2017, так что я предполагаю только реализацию 2.0