OpenCLのメモリモデル
データの取り扱いに階層構造があることからも連想できるように、OpenCLではメモリモデルにも階層構造が設けられている。また、データパラレルコンピューティングでは一つの特徴にもなっているのだが、そのメモリ内容の一貫性(コヒーレンシー)は甘めである。それはギチギチにいちいち同期を取っていたのでは並列性が上がらないためだ。
このメモリモデルを図解したのが下図になる。
ワークアイテム単位に持てるのがプライベートメモリ(Private Memory)、ワークグループ内で共有されるのがローカルメモリ(Local Memory)となる。プライベートメモリ内のメモリ読み込み、書き込みの一貫性は、そのワークアイテム内に限っては保たれる。同様にローカルメモリへのアクセス制御についても、その一貫性はワークグループ内のワークアイテム間では維持される。
グローバルメモリ(Global Memory)はGPUで言うところのビデオメモリに相当する物だ。これは各ワークグループ内ではアクセス制御が行われ、内容の一貫性も維持されるが、異なるワークグループ間では一貫性が保証されない。
ホストメモリ(Host Memory)はCPU管理下のメインメモリのこと。
まとめると、メモリ内容の一貫性はその管理階層内でしか保証されないと言うことだ。なので、ホストメモリ-グローバルメモリ-ローカルメモリの各階層間のデータ転送は、この特性に配慮して明確に行う必要があるということだ。