回答編集履歴

1 appendix

yohhoy

yohhoy score 4842

2018/07/23 16:54  投稿

(直接的には hayataka2049 さん回答にお任せしつつ、補足的な情報をいくつかご参考までに)
> 現在、Pythonで画像のグレースケールに変換する処理を並列で実行しようとしています。
画像処理を並列化する場合、質問文中のようにPixelLine単位で各プロセッサ/コアに振り分けるよりも、可能な限り画面領域単位とするほうが好ましいです。例えば高さ1000 Pixelの画像を4コアで処理する場合、250 PixelLineづつ4個コアに振り分ける方式の方がベターです。
> 他のサイトを見てみても5コア以上はそこまで高速化できてないようですが、それがなぜかまでは説明されておりませんでした、、、
どのような並列処理手法でも、必ず並列化によるオーバーヘッド(=追加の管理コスト)が発生します。並列化タスクの **粒度(grain)** を適切にコントロールすることが重要です。マルチプロセスやマルチスレッドは比較的オーバーヘッドが大きい並列化技法のため、出来るかぎり粗粒度(coarse grain)なタスク分割としておいたほうが無難です。
また計測データを見る限り、8コアまでは僅かですが高速化を達成できているようです。(期待するデータではないかもしれませんが、)論理8個コア環境下では正しく並列処理を実現できていると思います。おそらく、並列度を9以上に増やすといずれ処理速度が低下していくと思います。
並列処理による処理の高速化は、必ず「[アムダールの法則(Amdahl's law)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A0%E3%83%80%E3%83%BC%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)」に従います。並列処理をどの程度までがんばるべきか、性能限界を大まかに見積もる際に参考にされてください。
----
> あくまでも物理的には4コアですから、4(ハードウェア)スレッド以上使っても(処理内容にもよりますが)あまり高速化されないのが普通です。
個人的な経験則ですが、近年のIntel Coreアーキテクチャのハイパースレッディングは、昔のソレに比べてかなり実効性能向上が改善されている印象です。一時期はハイパースレッディングを無効化した方が総合性能が出たこともありましたが、近年では素直にハイパースレッディング有効で論理コア数まで並列化したほうが良いケースが大半と思います。(最終的にはケース・バイ・ケースですから、今回のように実測するべきですね)
個人的な経験則ですが、近年のIntel Coreアーキテクチャのハイパースレッディングは、昔のソレに比べてかなり実効性能向上が改善されている印象です。一時期はハイパースレッディングを無効化した方が総合性能が出たこともありましたが、近年では素直にハイパースレッディング有効で論理コア数まで並列化したほうが良いケースが大半と思います。(最終的にはケース・バイ・ケースですから、今回のように実測するべきですね)
> マルチスレッドで高速化出来ない件に関しては、GILで調べるとわかります。
> 結論だけ書くと、基本的に、そのマルチスレッドは演算を高速化する目的には使えません。
hayataka2049 さんと同意見で、残念ながらPython言語はこの手の並列処理・演算高速化に不向きです。Pythonに限らずですが、大抵のLL言語では GIL(GVL) がボトルネックになっています。真に並列化・処理高速化が必要な場合、最終的にはC言語などのネイティブ・コンパイル方式のプログラミング言語を利用する必要があると思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る