TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

OpenMPとは? 初めての並列化

OpenMPとは?並列プログラミングの基本と活用方法

1. OpenMPとは?

OpenMP(Open Multi-Processing) は、C、C++Fortran向けのマルチスレッド並列処理を簡単に実装できるAPI です。
主に、CPUのマルチコアを活用し、プログラムの処理速度を向上させるために使用されます。

OpenMPの特徴


2. OpenMPの環境構築

2.1 必要なコンパイラ

OpenMPは、多くのコンパイラでサポートされています。

コンパイラ サポート状況 オプション
GCCGNU Compiler Collection) -fopenmp
Clang -fopenmp
Intel Compiler -qopenmp
Microsoft Visual C++ /openmp

2.2 インストール(例:GCC

Linux/macOS の場合

sudo apt install gcc

または

brew install gcc

Windows の場合 - MinGW-w64 版のGCCをインストールし、環境変数を設定する


3. OpenMPの基本的な使い方

OpenMPは、#pragma omp ディレクティブ を使って並列化を行います。
以下に基本的な並列処理の例を示します。

3.1 「Hello, World!」を並列に出力する

#include <stdio.h>
#include <omp.h>

int main() {
    #pragma omp parallel
    {
        printf("Hello, World! from thread %d\n", omp_get_thread_num());
    }
    return 0;
}

実行結果(例)

Hello, World! from thread 0
Hello, World! from thread 1
Hello, World! from thread 2
Hello, World! from thread 3

スレッド数に応じて、複数の「Hello, World!」が出力されます。


4. OpenMPの基本ディレクティブ

4.1 #pragma omp parallel

指定したブロック内の処理を複数のスレッドで並列実行します。

#pragma omp parallel
{
    printf("This is a parallel region.\n");
}

4.2 #pragma omp for

ループを並列実行します。

#include <stdio.h>
#include <omp.h>

int main() {
    #pragma omp parallel for
    for (int i = 0; i < 10; i++) {
        printf("Iteration %d executed by thread %d\n", i, omp_get_thread_num());
    }
    return 0;
}

4.3 #pragma omp sections

異なる処理を並列実行する。

#pragma omp parallel sections
{
    #pragma omp section
    {
        printf("Task A\n");
    }
    #pragma omp section
    {
        printf("Task B\n");
    }
}

4.4 #pragma omp critical

クリティカルセクション(共有リソースへの同時アクセスを防ぐ)。

int counter = 0;

#pragma omp parallel
{
    #pragma omp critical
    {
        counter++;
    }
}

5. スレッド数の指定

デフォルトでは、スレッド数は環境に依存しますが、omp_set_num_threads(n) を使うと明示的に指定できます。

#include <stdio.h>
#include <omp.h>

int main() {
    omp_set_num_threads(4); // スレッド数を4に設定

    #pragma omp parallel
    {
        printf("Thread ID: %d\n", omp_get_thread_num());
    }
    return 0;
}

6. OpenMPのメリット・デメリット

メリット

  • 簡単に並列処理を導入できる
  • マルチコアCPUの性能を活用できる
  • 既存のコードを大きく変更せずに並列化が可能

デメリット

  • 共有メモリを使うため、競合(データ競合)が発生しやすい
  • スレッドの同期にオーバーヘッドがかかる
  • スレッド数が増えすぎると性能が落ちることがある

7. まとめ

OpenMPのポイント

簡単に並列処理を追加できる#pragma omp を使ってループや関数を並列実行スレッド数の管理や同期制御が可能競合状態を防ぐために criticalatomic を活用

OpenMPを活用すれば、計算負荷の高い処理をマルチスレッドで高速化できます。
特に、科学技術計算、画像処理、大規模データ処理 などで有効です。

今後、OpenMPを用いた実践的な並列プログラミングについても紹介していきますので、ぜひ試してみてください!

参考文献