2.15. メモリー領域

OpenCL-C言語ではメモリー空間をハードウェアのある下層にまでマップが可能なため、効率的なコードを書くためにはメモリー領域の理解をすることは必須となります。

前の項目で解説した「図表:プロセッサー・アーキテクチャー」(図1.1「図表:プロセッサー・アーキテクチャー」)では、Compute Unit(CU)とProcessing Element(PE)の関係を思い出してみてください。CUは複数のPEからなりますが、おおむねCUはワークグループにマップできPEはワークアイテム(スレッド)にマップされます。

図2.7 図表:メモリー・アーキテクチャー

images/OpenCLMemory.png

OpenCLがアクセスできるメモリー領域は、「図表:メモリー・アーキテクチャー」図2.7「図表:メモリー・アーキテクチャー」、のように4つのメモリー領域があります。

メモリーの種類

2.15.1. privateメモリ

privateメモリはProcessing Element(PE)に割り当てられています。プライベートメモリーはOpenCL C言語でコードする際に変数に対してメモリ修飾子の宣言をしない場合は既定の設定となります。

2.15.2. localメモリ

localメモリはCompute Unit(CE)に割り当てられています。ローカルメモリーは__localまたはlocalという修飾子を宣言すると領域が割り当てられます。

2.15.3. globalメモリ

globalメモリはヒープやスタック領域のことを指します。(ヒープやスタックのことは理解しているものとします。)__globalまたはglobalという修飾子を宣言することで領域を割り当てられます。

2.15.4. constantメモリ

constantメモリーはglobalと同様にコンピューターで通常メモリーをいう領域に割り当てられます。Javaではliteralがconstant領域に割り当てられます。OpenCL C APIでは、__constantまたは、constantという修飾子で宣言します。

Copyright 2018-2019, by Masaki Komatsu