Как работает openmp при использовании меньшего количества потоков, чем - PullRequest
0 голосов
/ 07 февраля 2019

Мой компьютер имеет 16 ядер.Моя программа похожа на следующую:

omp_set_num_threads(16);
....
#pragma omp parallel for num_threads(2)
for(int i =1; i<=2; ++i)
{
 \\time consuming operations
 }

Что более эффективно #pragma omp parallel for num_threads(2) или #pragma omp parallel for num_threads(16)?Или они одинаковые, так как это общая память?Обратите внимание на тот факт, что мои итерации цикла меньше 16.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Пропустите любую ручную спецификацию, такую ​​как 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 ядер ", вид кода.

Опять же, просто опустите его.Тем не менее, регулярно измеряйте вашу заявку.Если у вас есть конкретное указание на возможные проблемы с производительностью, переоцените выбор, основываясь на конкретных возможных измерениях.

0 голосов
/ 07 февраля 2019

Похоже, ваш for -петл вообще не является for -циклом: у вас есть только две итерации.Лучшим решением может быть использование OpenMP sections:

#pragma omp parallel sections
{
    #pragma omp section
    {
        // Time-consuming operations
    }
    #pragma omp section 
    {
        // Other independent time-consuming operations
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...