Embarrassingly Parallel なプログラムを pthread で並列化してみた
やったこと
後輩の授業で Embarrassingly Parallel なプログラムを並列化するという課題が出ていたので、ちょっとやってみました。
実際に使ったコードはgithubで公開中です。公開は課題の締切後に行いました。
課題1 1次元関数の数値積分の区間分割による並列化
実関数 が与えられ、 を区分求積法で求めるプログラムがあったとき、区間 を N 分割し、 N 個の POSIX thread に割り当てて並列化するという問題です。
この課題は練習用で、プログラムは公開されていました。単に走らせて性能を測ればよいものでした。
課題2.1 素数探索プログラムの区間分割による並列化
2から10000000までの整数のうち、素数がいくつあるかを数えるプログラムが与えられたとき、区間を N 個に分割し、 N 個の POSIX thread で並列化する問題です。課題1のコードを利用すればできる比較的簡単な課題です。
課題2.2 素数探索プログラムの負荷分散を考慮した並列化
素数の分布は一様ではないため、課題2.1のコードでは負荷が偏ってしまいます。そこで区間を M 分割し、 N 個の POSIX thread を利用することで並列化するのが本課題です。
やりかたは単純で、
というものです。各 thread は
for j in range(0 .. M-1) : if (j 番目のタスクは終わっていない) : j 番目のタスクをやる
とふるまいます。これに排他制御を行います。タスクを表す構造体に「手を付けた」というフラグを追加します。
for j in range(0 .. M-1) : lock(mutex) if (j 番目のタスクは誰も手を付けていない) : j 番目のタスクに手を付ける unlock(mutex) j 番目のタスクをやる else : unlock(mutex)
このようにすれば OK です。