見出し画像

処理に時間がかかるなら並列計算しよう!--並列処理をやってみよう!(C言語)--

案内人の加藤です🥕

今回は前回のイントロダクションの続きで、実際に並列処理をやってみます!

言語はC言語です!


OpenMPとは

OpenMP(Open Multi-Processing)とは共有メモリ型マシンで並列プログラミングを可能にする API(Application Programming Interface)

出典:株式会社計算力学研究センター

難しいですが、こいつを使えば並列化をできますよ!というアプリケーションです。並列化するという短い指示文を挿入するだけなので、並列化が簡単に可能です!

ここで、どんな風に並列化するかを知って欲しいので、まずはコアとスレッドについて解説します!

コアとは

コアとは、処理を実行する機械になります。要は処理する人間だと考えてください。昔はシングルコアというCPUの中にコアが1つなものが主流でしたが、現在は複数のコアを搭載しているPCのほうがメジャーになっています。

CPU内にコアは複数ある!

お手元のPCのコア数を確認する際には、タスクマネージャーを起動することで見ることができます!

詳しくは ⇩
<タスクマネージャの記事>

コア数はCPUの中に何個の処理ユニットがあるかを表しており、処理する事ができる人間の数に対応します。

スレッドとは

スレッドは1本の命令の流れになります。逐次的に処理されるため、for文で動かす部分は順番通りにソートした後に処理します。これを複数のスレッドに分けることができます!

スレッドは各コアの計算する命令とデータの集まり、つまり各コアに割り当てられる仕事の単位です!

大きなスレッドをスレッド1,2,3に分割して、各コアに処理させる。

スレッド数は1つのCPUが同時に実行状態に置くことが可能な処理の数で、最大でこの数分並列プログラムを稼働させることができます!

あなたのPCは何人のコアがある?

タスクマネージャで確認する事ができます。

Ctrl  + Shift + Esc キーを同時に押すことで、起動できます。

私のPCだと、12コアで論理プロセッサ数(スレッド数)が16個存在しています。

一般的には、「コア数=スレッド数」もしくは「2×コア数=スレッド数」となる物が多いですが、私のPCはそうなってはいませんね…

※ 1コアで2スレッド処理を行えるものと、1コアで1スレッド処理を行えるものがあります。

C コンパイラを準備しましょう!

WindowsであればMinGWをインストールしても良いですし、WSL2をインストールして、UbuntuにCコンパイラを導入する方法でも良いです。(Macならターミナルでgcc --version)と入力し、インストールしましょう!

※ ネットに様々な導入のやり方が紹介されているので、ご自身のPCに合わせて導入していただけたらと思います。ここでは省略します。

スレッドの数分自己紹介するプログラム

ここでは、PCで処理されるスレッド数分自己紹介する並列プログラムを書いてみました!

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

int main(void){
    #pragma omp parallel
    {
        printf("Hi! I'm in the %dst thread!\n", omp_get_thread_num());
    }
    return 0;
}

コピペで実行していただいてかまいません!

gcc と実行は以下です。(hello.cはファイル名です)

$ gcc -fopenmp hello.c -o test
$ ./test

出力結果

Hi! I'm in the 13st thread!
Hi! I'm in the 5st thread!
Hi! I'm in the 12st thread!
Hi! I'm in the 9st thread!
Hi! I'm in the 10st thread!
Hi! I'm in the 7st thread!
Hi! I'm in the 14st thread!
Hi! I'm in the 0st thread!
Hi! I'm in the 11st thread!
Hi! I'm in the 3st thread!
Hi! I'm in the 2st thread!
Hi! I'm in the 4st thread!
Hi! I'm in the 1st thread!
Hi! I'm in the 8st thread!
Hi! I'm in the 6st thread!
Hi! I'm in the 15st thread!

ちゃんと16個分のスレッドが反応してくれた事が確認できます!また、並列処理特有の非決定的な処理になっており、順番通り出力されていないことがわかります!

素晴らしいですね!

コードの詳細

今回使ったプログラムの詳細を説明します!

OpenMPのヘッダファイルをincludeする #include<omp.h>

OpenMPの機能を使うために、ヘッダファイルをincludeしています。

並列処理を行うディレクティブ #pragma omp parallel

このディレクティブを使用することで、並列領域を定義し、その中のコードが複数のスレッドで実行されるようになります!

コンパイルオプションの -fopenmp

OpenMPを使ってコンパイルする際にオプションの指定が必要になります。並列処理したい場合には忘れずに!

終わりに

これで、並列処理を行うやり方はわかったと思います!

結局はfor文の中身を並列処理するので、どうしても並列処理させたい部分の前に#pragma omp parallel とディレクティブを追加するだけで良いです!

この記事をきっかけに研究がはかどりますように!

参考

▽ 株式会社計算力学研究センター

https://www.rccm.co.jp/development/parallel/openmp.html


いいなと思ったら応援しよう!