반응형
병렬 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를 이용한 병렬 프로그래밍"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 성능 최적화 및 고급 테크닉 시리즈' 카테고리의 다른 글
[C++ 성능 최적화 및 고급 테크닉] Day 21: CUDA를 이용한 GPU 프로그래밍 (0) | 2024.08.01 |
---|---|
[C++ 성능 최적화 및 고급 테크닉] Day 18: 고급 멀티스레딩 기법 (락 프리 프로그래밍) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 16: std::thread와 동기화 기법 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 17: 병렬 알고리즘과 std::async (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 14: CRTP (Curiously Recurring Template Pattern) 사용법 (0) | 2024.08.01 |