並列処理の基本 

3月 27日 @ 21:00 ~ 22:00 主催者:y-tac

資料

講演

高速化その前に

CPUは逐次処理、 1コア1処理しかできない ため、

  • 高速化
  • マルチタスク

を目的に並列処理を行う。

高速化のための並列化

ハードウェア面

CPUは複数の命令回路からなっている。 フェッチ、デコード、演算、メモリアクセス、レジスタ書き込みといったCPUの一連の処理(命令パイプライン)を逐次実行することで、命令を処理する。この命令回路は各ブロックごとに別であるため、同時実行可能。

ソフトウェア面

マルチコア利用のためのライブラリがある。 基本的にはライブラリ使えば高速化できる。 注意点:

  • CPUリソース使い切ると応答しなくなることがある
  • 処理の間は疎結合でなければならない
  • 集約のための処理が必要

マルチタスクのための並列処理

1CPUコアで同時処理できるのは1プロセス。CPUの処理時間を細切れに割り当てることで、「人間から見るとマルチタスク」にできる。(CPUのタイムスライスという)

マルチプロセス/マルチスレッドの使い分け

マルチプロセス;複数のプロセスを立ち上げて処理させる。

  • 不正なプロセスが発生しても全滅しない
  • 処理をシンプルに保ちやすい
  • 全体的にリソース消費量が多い
  • アクセス周りが若干めんどい

マルチスレッド:プロセスの中に擬似CPUを作成し、疑似CPUがタイムスライスをする。

  • メモリを共有するので省メモリ
  • マルチプロセスより早い
  • スレッド間通信や排他制御などが複雑
  • スレッド一つが死ぬとみんな死ぬ

参加者の声

(Discord 上の発言で、なにか取り上げたいものがありましたら記載お願いします)

Q & A

(Discord 上に質問が流れたらピックアップお願いします)

  • Q.タスクとスレッドは同じですか?違いますか?

    • A.概念のレベルが異なる。「マルチタスク」の実現方法に、「マルチプロセス」「マルチスレッド」がある。
  • Q.(デモンストレーションで)Pythonを動かしているOSはなんですか?

    • A.ウブンツです
  • Q.Process の方は fork されて実行されているのでしょうか?

    • A.内部的にはfork処理が走っています
  • Q.ソースコードでt変数に2回代入していますが、2つのスレッドが起動するのでしょうか?

    • A. 実装の誤りでした(修正コミット済)
  • Q.開発するときは主にどちらを使うとかありますか?

    • A.マルチプロセスを使うことが多い、NW処理等で予期しないエラーによる処理落ちを考慮する場合はマルチプロセスが望ましい、IoTや組込でリソースが少ないなによってはマルチスレッドを採用する場合もあるが、リソースが潤沢であればマルチプロセスでよいのでは。
  • Q.たまにアプリによってはハイパースレッディングをうまく使えない奴とかありますが、Pythonのマルチプロセス・マルチスレッドは特に問題なく使ってくれる感じでしょうか?

    • A.今のところ処理系特有の問題は食らったことないです
  • Q.Pythonを使っているのは、なにか並行処理に優位性が在るからですか?

    • A.優位性とかではなく、手早くかけるから今回使っている。C言語ではちょっとめんどくさい。
  • Q.Pythonは動作が遅いと言われますが、そのへんどうですか?forループが遅いのですか? 工夫ってなんでしょうか?

    • A.スクリプト言語などで遅いというのはあるかもしれないが、Rubyとの速度の違いを感じることはない。ただしfor文は遅い。速度を求めてリスト内包表記を使うと複雑になってしまう。
  • Q.Python、スクリプト言語なのにマルチスレッド使えるのはびっくりしました。スレッドを用いた Python プログラムを書く際の注意があれば。

    • A.通信や排他制御のところで注意をする。それ以外はあまりCと変わらない。
  • Q.Pythonの場合のマルチスレッド?間の資源共有はどうするのか

    • A.(Pythonについてはわからず…)Cだと基本的にはアドレス管理されているので
  • Q. 実際、並列処理を用いて、日常的/仕事的に何か書かれてますか?

    • A.データの受信スレッド/処理スレッドを分割し、受信後に並列処理するようなものを作成したことがある。今のWeb系だと(FW/MWで処理されてしまうので)あまり意識しない、組込みをやっていたときのほうが多かった。
  • Q. 対象の処理によって変わると思いますが、スレッドもしくはプロセスを作成する際、数を決める目安とかありますか?(コア数と同等など)

    • A. コアを1つ空けておく(総コア数-1)ことが多い、スレッドを多くするとコンテキストスイッチ処理が多くなりオーバーヘッドが多くなるため無闇に増やすものではなく、リソースと目標の性能値 により調整する。バランス大事。