クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

プロセスで仕事を分けて合計する

このレッスンのあとで: 仕事をチャンクに切って、部分和を出し、まとめて全体の答えにできる。

55分のレッスンコマンド1件並列計算ラボ:GPU を使わずに GPU の考え方を JupyterLab で

仕事をチャンクに切って、別々のプロセスに任せる

プロセスとは、実行中のプログラム1つ分のことで、それぞれが自分のメモリを持ちます。仕事をいくつかのかたまり(チャンク)に切り、別々のプロセスに任せると、同時に進められます。

このレッスンでは、切り方と、結果のまとめ方を学びます。ラボにGPUはなく、ふつうのPythonのプロセスで確かめます。

このレッスンのゴール

メモ

仕事をチャンクに切って、部分和を出し、まとめて全体の答えにできる。

重要な言葉

ことばいみ
プロセス実行中のプログラム。自分のメモリを持つ
スレッド1つのプロセスの中で動く、小さな流れ
チャンク仕事を切り分けた、1つのかたまり
部分和1つのチャンクの合計
マージ部分の結果を、1つの答えにまとめること

学生が入力するセルは、このプレビューでは空白です。

仕事は、チャンクに切れば分担できる

1から40を足す仕事を、4人で分けるとします。10個ずつの4つのチャンクに切れば、各自が自分の部分和を出せます。

部分和は、55、155、255、355です。最後に4つを足すと820で、1人で全部を足した答えと同じです。

チャンクに切って部分和を出す

コード: python
# 1から40までを、10個ずつのチャンクに切って、部分和を出します。
data = list(range(1, 41))
size = 10
partials = []
start = 0
while start < len(data):
    chunk = data[start:start + size]
    partials.append(sum(chunk))
    start = start + size
print("部分和:", partials)
print("まとめた合計:", sum(partials))
# size を 5 に変えて、部分和の数と合計を見ましょう。

プロセスはメモリを分け、スレッドは共有する

プロセスは、それぞれが自分のメモリを持ちます。スレッドは、同じプロセスのメモリを共有します。

Pythonの標準の実装には、同時にPythonの命令を進められるスレッドは1つだけ、という制限があります。計算を同時に進めたいときは、プロセスを使います。

プロセスとスレッドの違い

プロセススレッド
メモリ自分の分を持つ同じプロセスと共有する
データの受け渡し結果を送り返す必要がある同じ変数を読める
Pythonの計算を同時に進めるできる標準の実装では難しい

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

スレッドを増やせば、Pythonの計算はいつも速くなると思いがちです。標準の実装では、計算に使うスレッドは同時に1つしか進みません。計算を分けるなら、プロセスを使います。待ち時間の多い仕事には、スレッドが向きます。

ラボの端末で、2つのワーカーに分担させる

ラボにGPUはありません。Pythonの multiprocessing が、2つのプロセスで4つのチャンクを分担します。

スクリプトの出力には英語の単語が出ます。chunk の番号の次に部分和が並びます。どのプロセスが先に終わっても、結果はチャンクの順に返ります。

チャンクの部分和を出す

コマンド
docker exec jupyter python3 steps/chunks.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

さらに挑戦: 切り方を考える

100個のデータを、3人で分けるとします。33個ずつに切ると、最後は1個余ります。

余りを、一番最後のチャンクに足すのと、新しいチャンクにするのとでは、どちらが公平でしょうか。自分の言葉で説明しましょう。

このラボとソースについて: 並列計算ラボ:GPU を使わずに GPU の考え方を JupyterLab で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。