OpenMP, используйте все ядра с параллельным - PullRequest
4 голосов
/ 29 ноября 2011

У меня есть компьютер с 4 ядрами и приложение OMP с 2 вескими задачами.

int main()
{
    #pragma omp parallel sections
    {
        #pragma omp section
        WeightyTask1();

        #pragma omp section
        WeightyTask2();
    }

    return 0;
}

Каждая задача имеет такую ​​весомую часть:

#omp pragma parallel for
for (int i = 0; i < N; i++)
{
    ...
}

Я скомпилировал программу с параметром -fopenmp, сделал export OMP_NUM_THREADS=4. Проблема заключается в том, что загружены только два ядра . Как я могу использовать все ядра в своих задачах?

1 Ответ

2 голосов
/ 29 ноября 2011

Моя первоначальная реакция была: вы должны объявить больше параллелизма.

Вы определили две задачи, которые могут выполняться параллельно. Любая попытка OpenMP запустить его на более чем двух ядрах замедлит вас (из-за локальности кэша и возможного ложного совместного использования).

Редактировать Если параллельные циклы for имеют какой-либо значительный объем (скажем, не менее 8 итераций), и вы не видите, что используется более 2 ядер, посмотрите

  • omp_set_nested()
  • OMP_NESTED = TRUE | FALSE переменная среды

    Эта переменная среды включает или отключает вложенный параллелизм. Значение этой переменной среды можно изменить, вызвав функцию библиотеки времени выполнения omp_set_nested().

    Если вложенный параллелизм отключен, вложенные параллельные области сериализуются и выполняются в текущем потоке.

    В текущей реализации вложенные параллельные области всегда сериализуются. В результате OMP_SET_NESTED не оказывает никакого влияния, а omp_get_nested() всегда возвращает 0. Если опция -qsmp = nested_par включена (только в нестрогом режиме OMP), вложенные параллельные области могут использовать дополнительные доступные потоки. Однако новая команда для создания вложенных параллельных областей не создается. Значением по умолчанию для OMP_NESTED является FALSE.

...