C++での並列化

投稿者: | 2020年1月13日

また卒研の話です。論文にある手法を別の暗号に当てはめるということをやっているので、論文の手法をそのままやってみています。

そのなかで、2^40個のkey streamを調べてみる必要があるらしいので、そのとおりにやってみようとしました。

しかし、2^40個は約100兆個。普通に計算させていたら終わらない。

ということで、並列化をやってみました。

変更後のコードはこちらから。

最初に

[cpp] #include <omp.h> [/cpp]

が必要です。

今回やったことはforループを並列化するので、そのためには、並列化したいfor文の前に

[cpp] #pragma omp parallel [/cpp]

を入れるとOKです。

その後ろは色々とあるのですが、今回はあまり使っていないので、これだけです。

コンパイルするときは、

[bash] g++ -fopenmp chacha.cpp [/bash]

でOKです。調べていると、後ろに色々オプションが付いていますが、

  • -O1 : 基本コードブロックの最適化
  • -O2 : さらに基本コード間の最適化
  • -fastsse : SSEによるベクトル実行

らしいです。

-O4まであるらしいですが、-O2を使うのが一般的らしい。

あと使い方は、いい感じのスライド資料が落ちてたのでそれ見てください。さすが東大様やで。

あと良さそうなpdf。

追記(2020/01/13)

[cpp]omp_get_max_threads()[/cpp]

で取得した使用可能スレッド数が2で固定だったので、なんだこれ?ってなってました。

OpenMPでいうスレッド数と自作PCerが言うスレッド数は異なるものなんじゃないかと思って調べていたら、最適なスレッド数が出てきました。

使用機材がCore2 Duo T7200 で2コア2スレッドです。そのCPUでもスレッド数を増やしていくと32スレッドで頭打ちになっているようでした。

そういうわけで、

[cpp] omp_set_num_threads(16); [/cpp]

として動かしてみました。

そうした上でタスクマネージャーにおいてCPUの使用率グラフを見てみましたが、1コア(論理プロセッサ数2)だけ100%になったので、思ってたものが違うっぽい。

システムにおいては、タスクの中に複数のプロセスが含まれており、プロセスの中に複数のスレッドが含まれています。プロセスとスレッドは処理の分割の単位です。

タスクマネージャーを見れば、プロセス数に並んでスレッド数とハンドル数が表示されています。

OpenMPにおいて環境変数で指定できるスレッド数はこちらの話であり、自作PCerが想像しているものとは大きく異なっています。

自作PCerが想像するスレッドはIntelの ハイパースレッディング・テクノロジー によるスレッドのことです。こちらは、1コアを複数のコアと認識させるものなので、先程の”スレッド”ではありません。

要するに私は、スレッド数をCPUの性能であるCore/Threadのことだと勘違いしていたわけです。

紛らわしいんじゃー!!!(自作PCer感)

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください