본문 바로가기
-----ETC-----/C++ 성능 최적화 및 고급 테크닉 시리즈

[C++ 성능 최적화 및 고급 테크닉] Day 19: 병렬 STL 사용법

by cogito21_cpp 2024. 8. 1.
반응형

병렬 STL이란?

C++17에서는 표준 라이브러리에 병렬 알고리즘을 도입하여, 기존의 STL 알고리즘을 병렬로 실행할 수 있게 되었습니다. 이를 통해 멀티코어 CPU의 성능을 최대한 활용할 수 있습니다.

 

std::execution

C++17에서는 std::execution 네임스페이스를 통해 병렬 실행 정책을 정의할 수 있습니다. 주요 실행 정책은 다음과 같습니다:

  • seq: 순차적으로 실행
  • par: 병렬로 실행
  • par_unseq: 병렬로 실행하고, 실행 순서는 정의되지 않음

병렬 STL 알고리즘

기존 STL 알고리즘에 병렬 실행 정책을 적용하여 병렬로 실행할 수 있습니다. 예를 들어, std::sort, std::for_each, std::transform 등 다양한 알고리즘이 병렬 실행을 지원합니다.

 

병렬 정렬

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
    std::vector<int> vec = {5, 2, 9, 1, 5, 6};

    // 병렬로 정렬
    std::sort(std::execution::par, vec.begin(), vec.end());

    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

병렬 for_each

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 병렬로 각 요소를 두 배로 증가
    std::for_each(std::execution::par, vec.begin(), vec.end(), [](int& n) {
        n *= 2;
    });

    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

병렬 transform

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());

    // 병렬로 각 요소를 제곱
    std::transform(std::execution::par, vec.begin(), vec.end(), result.begin(), [](int n) {
        return n * n;
    });

    for (int n : result) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

병렬 reduce

C++17에서는 std::reduce 함수를 사용하여 병렬로 합계를 계산할 수 있습니다.

#include <iostream>
#include <vector>
#include <numeric>
#include <execution>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 병렬로 벡터 합계 계산
    int sum = std::reduce(std::execution::par, vec.begin(), vec.end());

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

 

실습 문제

문제 1: 병렬 STL을 사용하여 벡터의 요소를 제곱하고 합계를 계산하기

다음 코드에서 병렬 STL을 사용하여 벡터의 각 요소를 제곱한 후 병렬로 합계를 계산하세요.

 

main.cpp

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());

    // 각 요소를 제곱
    std::transform(vec.begin(), vec.end(), result.begin(), [](int n) {
        return n * n;
    });

    // 벡터 합계 계산
    int sum = std::accumulate(result.begin(), result.end(), 0);

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

 

해답:

main.cpp (병렬 STL 적용)

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <execution>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());

    // 병렬로 각 요소를 제곱
    std::transform(std::execution::par, vec.begin(), vec.end(), result.begin(), [](int n) {
        return n * n;
    });

    // 병렬로 벡터 합계 계산
    int sum = std::reduce(std::execution::par, result.begin(), result.end());

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

 

이제 열아홉 번째 날의 학습을 마쳤습니다. 병렬 STL의 개념과 사용법을 이해하고, 이를 사용하여 성능을 최적화하는 방법을 학습했습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "OpenMP를 이용한 병렬 프로그래밍"에 대해 학습하겠습니다.

반응형