Параллельные вычисления на C ++ с OpenMP не влияют на затраченное время - PullRequest
0 голосов
/ 08 мая 2020

Я изучаю OpenMP. Я пытаюсь реализовать несколько примеров, чтобы проверить свое понимание. Ниже приведен простой код, в котором я пытаюсь вычислить простую сумму (добавляя каждый раз только ноль) и сравнивать эффективность распараллеленного кода с помощью openMP и другого кода. Вот он:

#include <iostream>
#include <omp.h>
#include <unistd.h>
#include <chrono>

int main(){
    int N = 100000;
    int sum;
    std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();


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

    end = std::chrono::system_clock::now();
    std::cout << "Parallel Elapsed time:" << std::endl;
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()<<std::endl;


    start = std::chrono::system_clock::now();
    for(int i = 0; i < N; i++){
        sum += 0;
    }


    end = std::chrono::system_clock::now();
    std::cout << "Sequential Elapsed time:" << std::endl;
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() <<std::endl;


    return 0;
}

Что дает:

Parallel Elapsed time:
351000
Sequential Elapsed time:
367000

Или около этих цифр после нескольких казней. У меня вопрос: где подвох? Похоже, с моим кодом все в порядке.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Нет. Ваш код not хорошо!

Прежде всего, код неправильно сформирован , потому что сумма не инициализируется равной 0, если OpenMP не включен (вы включили OpenMP с использованием аргументов компилятора?). Таким образом, последовательная реализация приводит к неопределенному поведению . Это важно, потому что спецификация OpenMP гласит, что:

OpenMP API предназначен для поддержки программ, которые будут правильно выполняться как как параллельные программы [...], так и как последовательные программы. .

Более того, компилятор достаточно умен, чтобы удалить бесполезное дополнение , если вы включили оптимизацию компилятора (не так ли?), Как указал @HighPerformanceMark. Обратите внимание, что sum даже не читается, поэтому компилятор может полностью игнорировать эту переменную. Я советую вам посмотреть эту Конференцию по C ++ , объясняющую, как правильно проводить тесты и анализировать производительность.

Кроме того, вы используете system_clock , что не является монотонным c. Действительно, в документации стандартной библиотеки C ++ указано, что:

в большинстве систем системное время можно изменить в любой момент

В результате полученные вами тайминги могут быть совершенно неправильно и даже возможно отрицательно! Пожалуйста, используйте stable_clock , который больше подходит для измерения времени настенных часов.

Наконец, для создания потоков может потребоваться время, как упоминалось в @JeanMarcVolle. Таким образом, многопоточность полезна только в том случае, если параллельная работа довольно велика по сравнению с накладными расходами на потоки. Здесь не стоит. Однако вместо этого вы можете использовать параллелизм на основе SIMD, используя директиву #pragma omp simd reduction(+:sum).

1 голос
/ 08 мая 2020

Многопоточность OpenMP требует времени, поэтому, если ваш код почти ничего не делает в части, которая была парализована (здесь вы просто суммируете), выигрыш от параллельного выполнения вещей сводится к нулю за время, необходимое для создания / выбора потоков openMP.

Кроме того, в вашем коде вы используете сокращение, поэтому все ваши потоки, скорее всего, будут заблокированы в ожидании доступа к общей переменной sum. Я даже удивлен, что вы получаете прирост производительности при использовании openMp в этом конкретном случае c.

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

Вы можете, например, попробовать (в качестве «упражнения») отсортировать независимые векторы (без сокращения) параллельно и последовательно, чтобы увидеть преимущества openMP.

...