Один и тот же класс, 2 программы, разные ускорения OpenMP; MSVC2017 - PullRequest
0 голосов
/ 25 марта 2020

У меня есть класс C ++, некоторые функции которого имеют параллельные OpenMP циклы. Я делаю его на два приложения с MSVC2017 и обнаруживаю, что одна из этих функций работает по-разному в двух приложениях. Функция имеет две отдельные параллели для циклов. В одной сборке VS-отладчик показывает им обоим использование 7 ядер в течение solid секунды при обработке блока тестовых данных; с другой стороны, он показывает только два всплеска многоядерного использования, предположительно в начале каждой параллельной секции, но большую часть времени работает только 1 процессор.

Эти функции находятся глубоко внутри кода для класса, который идентичен в 2 приложениях. Сборки имеют те же параметры компилятора и компоновщика, насколько я вижу. Я создаю проекты с помощью CMake и никогда не изменяю их вручную.

Кто-нибудь может подсказать возможные причины такого поведения? Я полностью осведомлен о других способах распараллеливания кода, поэтому, пожалуйста, не рассказывайте мне о них. Я просто ищу экспертизу по OpenMP под MSV C.

1 Ответ

0 голосов
/ 26 марта 2020

Я ожидаю, что два звонка проходят в разной работе. Рассмотрим (например, тривиальный, напечатанный в этом посте, не скомпилированный, а не способ написать это!) Код, подобный

void scale(int n, double *d, double f) { 
#pragma omp parallel for
    for (int i=0; i<n; i++)
        d[i] = d[i] * f;
}

Если вызвать с большим вектором, где n == 10000, вы получите несколько параллелизм и много потоков работает. Если вызывается с n == 3, очевидно, что работа только для трех потоков! Если вы используете #pragma omp parallel for schedule(dynamic), вполне возможно, что даже с десятью или двадцатью итерациями один поток выполнит большинство из них.

В заключение: контекст имеет значение.

...