Пропустите любую ручную спецификацию, такую как omp_set_num_threads
или num_threads
, и дайте реализации понять это.
Практически, в любом случае не должно быть заметных различий.
omp_set_num_threads
полностью избыточен, так как применяется только к последующим параллельным областям, в которых не указано предложение num_threads
.Поэтому, если вы чувствуете, что должны, используйте предложение omp_set_num_threads
или num_threads
, так как это просто вводит читателя в заблуждение.
Возможно, что num_threads(2)
, как бы он ни был указан, лучше.У него меньше накладных расходов на инициализацию для создания меньшего количества потоков.Это, вероятно, не имеет значения.Существует теоретический аргумент, что чрезмерные потоки, которые не нужно выполнять, могут истощать общие ресурсы во время ожидания (общие ядра с гиперпоточностью, powercap) - тем не менее это не должно иметь значения, поскольку реализации OpenMP не выполняют неопределенное ожидание занятости.
С другой стороны, ручное указание num_threads(2)
создает избыточность.Что если ваш цикл изменится на три итерации, но вы забудете?Вы тратите впустую производительность.То же самое касается " Я поставил num_threads(X)
, потому что у меня есть X
ядер ", вид кода.
Опять же, просто опустите его.Тем не менее, регулярно измеряйте вашу заявку.Если у вас есть конкретное указание на возможные проблемы с производительностью, переоцените выбор, основываясь на конкретных возможных измерениях.