[c++] C++에서의 멀티코어 및 멀티프로세서 지원 기술

C++는 멀티스레딩, 병렬처리, 그리고 멀티코어 및 멀티프로세서 시스템에서의 성능 향상을 위한 다양한 기술을 제공합니다. 이 기술들은 최신 하드웨어 환경에서의 프로그램의 성능을 극대화하는 데 중요한 역할을 합니다.

1. 멀티스레딩 지원

C++11부터 표준 라이브러리에 멀티스레딩을 지원하는 스레드 라이브러리가 포함되었습니다. std::thread를 사용하여 여러 스레드를 만들고 관리할 수 있습니다. 또한, std::mutexstd::atomic 등을 활용하여 스레드 간의 안전한 데이터 공유 및 동기화를 할 수 있습니다.

#include <thread>
#include <mutex>

std::mutex myMutex;
int sharedData = 0;

void threadFunction()
{
    std::lock_guard<std::mutex> guard(myMutex);
    sharedData++;
}

int main()
{
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);

    t1.join();
    t2.join();

    return 0;
}

2. 병렬 알고리즘

C++17부터는 병렬 실행을 지원하기 위해 병렬 알고리즘을 제공합니다. std::for_each, std::transform, std::reduce 같은 알고리즘은 멀티코어 시스템에서 데이터 처리를 병렬화하여 성능을 향상시킬 수 있습니다.

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

int main()
{
    std::vector<int> data = {1, 2, 3, 4, 5};
    std::for_each(std::execution::par, data.begin(), data.end(), [](int& x) { x *= 2; });

    for (int val : data)
    {
        std::cout << val << " ";
    }

    return 0;
}

3. SIMD 지원

C++는 단일명령 다중데이터(SIMD)를 활용하여 벡터화된 연산을 수행하는 데에도 효과적입니다. SIMD 지원을 통해 멀티프로세서의 벡터 유닛을 활용하여 데이터 병렬성을 극대화할 수 있습니다. 예를 들어, Intel의 SSE(Streaming SIMD Extensions)나 AMD의 AVX(Advanced Vector Extensions)와 같은 SIMD 명령어를 사용할 수 있습니다.

#include <iostream>
#include <immintrin.h>

int main()
{
    float a[8] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f};
    float b[8] = {8.0f, 7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f};
    float c[8];

    __m256 va = _mm256_loadu_ps(a);
    __m256 vb = _mm256_loadu_ps(b);
    __m256 vc = _mm256_add_ps(va, vb);
    _mm256_storeu_ps(c, vc);

    for (int i = 0; i < 8; ++i)
    {
        std::cout << c[i] << " ";
    }

    return 0;
}

C++는 이러한 멀티코어 및 멀티프로세서 환경에서의 프로그래밍을 보다 효율적으로 지원하며, 최신 하드웨어의 성능을 극대화하는 데에 유용한 다양한 기술을 제공합니다.

참고 자료