CUDA C プロフェッショナルプログラミング第2章 4/9
実行モデル:特定のコンピューティングアーキテクチャで命令がどのように実行されるのかを計算処理の観点から定義する.
...CUDAの実行モデルではGPUの並列アーキテクチャが抽象的に表現されており,スレッドの並列性について論じることができる.
CUDAの実行モデルは命令スループットとメモリアクセスという観点から効率的なコードを記述するのに役立つ手がかりを与える.
GPUアーキテクチャの概要
SIMTアーキテクチャ:スレッドが32個ずつ,ワープと呼ばれるグループにまとめられた上で実行される.
ワープ内のスレッドはすべて同じ命令を同時に実行する.
スレッドはそれぞれ命令実行パスとレジスタ状態を保ち,独自のデータで現在の命令を実行する.
各SMは割り当てられたスレッドブロックを32個のスレッドからなるワープに分割し,利用可能なハードウェアソースにスケジュールする.
### SIMDとSIMTの違い
SIMD : ベクトル内のすべての要素を一つの同期グループで同時に実行しなければならない.
SIMT:同じワープ内の複数のスレッドを独立として実行できる.
...ワープ内のスレッドは全て同じプログラムアドレスで同時に開始されるが,個々のスレッドの振る舞いは異なっている可能性がある.
乱択アルゴリズム 1
Fermat's little theoremを乱択アルゴリズムで表現することを考える.
p : prime number
a in {1, 2, ..., p-1}
(mod p)
p=5, a=2 (mod5)
m, n; integers m>n>0
m = qm+r 0 < r < n
m = 13, n = 8
13 = 18 + 5
13 5 (mod 8) <
CUDA C プロフェッショナルプログラミング第2章 4/5
スレッドの構成:
ブロック: 複数のスレッドからなる束.
一つのカーネルによって生成された全てのスレッドをまとめてグリッドと呼ぶ.
グリッド内のスレッドはすべて同じグローバルメモリ空間を共有している.
グリッドは複数のスレッドブロックで構成されている.
スレッドとブロッ=互いに協調して動作できるスレッドのグループであり以下の機能を利用できる.
・ブロックに属するスレッド間の同期
・ブロック内で共有されるメモリ
*異なるブロックに属しているスレッド同士が協調して動作することはできない.
(要はブロックはCPU版のプロセスか?)
スレッドは互いを区別するために,以下の一意な座標を使用する.
・bloxkIdx ... グリッド内のブロックのインデックス
・threadIdx ... ブロック内のスレッドのインデックス
グリッドとブロックのサイズは以下の二つの組み込み変数によって指定される.
・blockDim ... スレッドの数によって指定されるブロックのサイズ
・gridDim ... ブロックの数によって指定されるグリッドのサイズ
グリッドとブロックの次元
グリッド: ブロックの二次元配列.
ブロック: スレッドの三次元配列.
マルチスレッドプログラミング入門
例:受信と処理を含むプログラムをマルチタスクプログラミングする.
受信バッファをどうやって共有するのかが問題になる.
マルチプロセス: プロセス間で受信データを引き渡す必要が生じる.
マルチスレッド: 受信スレッドと処理スレッドは同じメモリ空間を共有している.
...受信バッファは普通にメモリ上に置かれた変数で十分.
マルチスレッドを使ったプログラムを組むためには次の基本機能を持つライブラリが必要.
1. スレッドの管理
2. 動作の排他
3. イベント通知
4. 動作の一時停止
pthreadsライブラリにはこれらの機能がコンプクトにまとめられている.
不動産価格に関する仮説
都心において新規に物件が増える一方で,郊外において空き家が増えている. これは需給の点から過剰供給のように思えなくもない. しかし,両者が財として同じ性質を持つのか,という疑問がある. つまり,両者は異なる需要を満たしているのではなかろうか. ある種の入れ子状態になっているような需給関係を考えなくてはならない.