반응형
실전 최적화 사례 연구
최적화는 실제 프로젝트에서 성능을 극대화하는 중요한 과정입니다. 이번 단계에서는 실전에서 적용할 수 있는 최적화 사례를 연구하여, 코드의 성능을 개선하는 방법을 배우겠습니다.
사례 1: 루프 최적화
루프는 많은 연산이 집중되는 부분입니다. 루프 최적화를 통해 성능을 크게 향상시킬 수 있습니다. 예를 들어, 루프 언롤링(loop unrolling)과 루프 인터체인징(loop interchange)을 사용할 수 있습니다.
예제 코드: 루프 최적화 전
#include <iostream>
#include <vector>
void sumRows(const std::vector<std::vector<int>>& matrix, std::vector<int>& result) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
result[i] = 0;
for (int j = 0; j < n; ++j) {
result[i] += matrix[i][j];
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<int> result(n);
sumRows(matrix, result);
std::cout << "Sum of first row: " << result[0] << std::endl;
return 0;
}
예제 코드: 루프 최적화 후
#include <iostream>
#include <vector>
void sumRows(const std::vector<std::vector<int>>& matrix, std::vector<int>& result) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
result[i] = 0;
for (int j = 0; j < n; j += 4) { // 루프 언롤링 적용
result[i] += matrix[i][j] + matrix[i][j + 1] + matrix[i][j + 2] + matrix[i][j + 3];
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<int> result(n);
sumRows(matrix, result);
std::cout << "Sum of first row: " << result[0] << std::endl;
return 0;
}
사례 2: 메모리 접근 최적화
메모리 접근 패턴을 최적화하면 캐시 성능을 개선하여 성능을 향상시킬 수 있습니다. 행렬의 행 우선 접근과 열 우선 접근의 차이를 예로 들 수 있습니다.
예제 코드: 메모리 접근 최적화 전
#include <iostream>
#include <vector>
void transpose(const std::vector<std::vector<int>>& matrix, std::vector<std::vector<int>>& result) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
result[j][i] = matrix[i][j];
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<std::vector<int>> result(n, std::vector<int>(n));
transpose(matrix, result);
std::cout << "Element (0, 0): " << result[0][0] << std::endl;
return 0;
}
예제 코드: 메모리 접근 최적화 후
#include <iostream>
#include <vector>
void transpose(const std::vector<std::vector<int>>& matrix, std::vector<std::vector<int>>& result) {
int n = matrix.size();
for (int i = 0; i < n; i += 4) { // 루프 인터체인징 적용
for (int j = 0; j < n; ++j) {
result[j][i] = matrix[i][j];
result[j][i + 1] = matrix[i + 1][j];
result[j][i + 2] = matrix[i + 2][j];
result[j][i + 3] = matrix[i + 3][j];
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<std::vector<int>> result(n, std::vector<int>(n));
transpose(matrix, result);
std::cout << "Element (0, 0): " << result[0][0] << std::endl;
return 0;
}
사례 3: 함수 인라인
함수 호출 오버헤드를 줄이기 위해 작은 함수는 인라인으로 정의할 수 있습니다.
예제 코드: 함수 인라인 전
#include <iostream>
int add(int a, int b) {
return a + b;
}
int main() {
int sum = 0;
for (int i = 0; i < 1000000; ++i) {
sum += add(i, i);
}
std::cout << "Sum: " << sum << std::endl;
return 0;
}
예제 코드: 함수 인라인 후
#include <iostream>
inline int add(int a, int b) {
return a + b;
}
int main() {
int sum = 0;
for (int i = 0; i < 1000000; ++i) {
sum += add(i, i);
}
std::cout << "Sum: " << sum << std::endl;
return 0;
}
실습 문제
문제 1: 최적화 기법 적용하기
다음 코드에서 루프 언롤링과 함수 인라인 기법을 사용하여 성능을 최적화하세요.
main.cpp
#include <iostream>
#include <vector>
int add(int a, int b) {
return a + b;
}
void sumRows(const std::vector<std::vector<int>>& matrix, std::vector<int>& result) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
result[i] = 0;
for (int j = 0; j < n; ++j) {
result[i] += add(matrix[i][j], matrix[i][j]);
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<int> result(n);
sumRows(matrix, result);
std::cout << "Sum of first row: " << result[0] << std::endl;
return 0;
}
해답:
main.cpp (최적화 적용)
#include <iostream>
#include <vector>
inline int add(int a, int b) {
return a + b;
}
void sumRows(const std::vector<std::vector<int>>& matrix, std::vector<int>& result) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
result[i] = 0;
for (int j = 0; j < n; j += 4) { // 루프 언롤링 적용
result[i] += add(matrix[i][j], matrix[i][j]) +
add(matrix[i][j + 1], matrix[i][j + 1]) +
add(matrix[i][j + 2], matrix[i][j + 2]) +
add(matrix[i][j + 3], matrix[i][j + 3]);
}
}
}
int main() {
int n = 1000;
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 1));
std::vector<int> result(n);
sumRows(matrix, result);
std::cout << "Sum of first row: " << result[0] << std::endl;
return 0;
}
이제 스물두 번째 날의 학습을 마쳤습니다. 실전 최적화 사례를 통해 루프 최적화, 메모리 접근 최적화, 함수 인라인 등의 기법을 적용하는 방법을 학습했습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "실전 최적화 사례 연구 (2)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 성능 최적화 및 고급 테크닉 시리즈' 카테고리의 다른 글
[C++ 성능 최적화 및 고급 테크닉] Day 24: 프로젝트: 고성능 매트릭스 라이브러리 개발 (1) (0) | 2024.08.01 |
---|---|
[C++ 성능 최적화 및 고급 테크닉] Day 25: 프로젝트: 고성능 매트릭스 라이브러리 개발 (2) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 23: 실전 최적화 사례 연구 (2) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 20: OpenMP를 이용한 병렬 프로그래밍 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 21: CUDA를 이용한 GPU 프로그래밍 (0) | 2024.08.01 |