본문 바로가기
-----ETC-----/C++ 심화 알고리즘과 자료구조 시리즈

[C++로 배우는 알고리즘과 자료구조 심화] Day 29: 병렬 알고리즘 (Parallel Algorithms)

by cogito21_cpp 2024. 8. 1.
반응형

병렬 알고리즘 (Parallel Algorithms)

병렬 알고리즘은 여러 프로세서가 동시에 작업을 수행하여 문제를 해결하는 알고리즘입니다. 이러한 알고리즘은 대규모 데이터 처리 및 고성능 컴퓨팅에 매우 유용합니다. 병렬 알고리즘을 설계할 때는 데이터 병렬성, 작업 병렬성, 동기화 및 통신 비용 등을 고려해야 합니다.

병렬 알고리즘의 주요 기법

  1. 데이터 병렬성: 동일한 작업을 여러 데이터에 동시에 적용합니다.
  2. 작업 병렬성: 여러 작업을 동시에 수행합니다.
  3. 동기화: 작업 간의 일관성을 유지하기 위해 동기화 메커니즘을 사용합니다.

문제 예시: 병렬 퀵 정렬

퀵 정렬은 분할 정복 알고리즘으로, 병렬화가 가능한 부분이 많습니다. 병렬 퀵 정렬은 배열을 분할한 후, 각 분할된 부분 배열을 별도의 스레드에서 정렬하여 병렬 처리를 수행합니다.

병렬 퀵 정렬 구현

다음은 C++로 병렬 퀵 정렬을 구현한 예제입니다. 이 예제에서는 C++11의 std::thread를 사용하여 병렬 처리를 수행합니다.

#include <iostream>
#include <vector>
#include <thread>
#include <algorithm>

// 배열 분할 함수
int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);
    return i + 1;
}

// 병렬 퀵 정렬 함수
void parallelQuickSort(std::vector<int>& arr, int low, int high, int depth = 0) {
    if (low < high) {
        int pi = partition(arr, low, high);

        if (depth < 4) { // 깊이 제한을 통해 무한 스레드 생성 방지
            std::thread leftThread(parallelQuickSort, std::ref(arr), low, pi - 1, depth + 1);
            std::thread rightThread(parallelQuickSort, std::ref(arr), pi + 1, high, depth + 1);
            leftThread.join();
            rightThread.join();
        } else {
            parallelQuickSort(arr, low, pi - 1, depth + 1);
            parallelQuickSort(arr, pi + 1, high, depth + 1);
        }
    }
}

int main() {
    std::vector<int> arr = {10, 7, 8, 9, 1, 5, 3, 4, 2, 6};
    int n = arr.size();

    parallelQuickSort(arr, 0, n - 1);

    std::cout << "정렬된 배열: ";
    for (int x : arr) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

설명

  1. 입력:
    • arr: 정렬할 배열
    • low: 배열의 시작 인덱스
    • high: 배열의 끝 인덱스
  2. 배열 분할:
    • partition 함수는 피벗을 기준으로 배열을 두 부분으로 분할합니다.
    • 피벗보다 작은 요소는 피벗의 왼쪽에, 큰 요소는 피벗의 오른쪽에 배치됩니다.
  3. 병렬 퀵 정렬:
    • parallelQuickSort 함수는 배열을 분할한 후, 각 분할된 부분 배열을 병렬로 정렬합니다.
    • 깊이 제한(depth)을 통해 무한 스레드 생성 문제를 방지합니다.
    • 재귀적으로 각 부분 배열을 정렬합니다.

병렬 알고리즘의 기본 개념과 병렬 퀵 정렬의 구현 방법을 이해했습니다. 질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 30: 양자 알고리즘(Quantum Algorithms) 소개"에 대해 학습하겠습니다.

반응형