Chapter 7. メモリーモデル

Table of Contents

7.1. デバイスメモリへのコピー
7.1.1. デバイスメモリ複製のユーティリティ関数

OpenCLでは、OpenCLが管理するCPU、GPUやアクセラレータ等のプロセッサデバイスがアクセスするメモリ空間と、一般的な用途に使うホストメモリ空間を区別します。

デバイスがPCIeなどの外付デバイスの場合にホストメモリは、システムメモリ・メインメモリの空間の保管場所は物理的に異なります。外付デバイスであれば、デバイスメモリへコピーする必要があり、内臓デバイスではホストメモリの領域内において、ホストが管理するメモリ空間からOpenCLデバイスが管理するメモリ空間へのコピーを行います。

内臓デバイスと外付デバイスの区別としては原則として以下のようになります。

外付デバイス
ホストに割り当てたメモリから、デバイス内のメモリへコピーします。
内臓デバイス
CPUやiGPUなどの内臓デバイスの場合はメインメモリ内にOpenCLデバイスが使うためのメモリ空間を割り当て、同じくメインメモリ内のホストメモリからコピーして使います。

デバイス内のメモリをバッファ、メモリオブジェクト等と呼びますが、PyOpenCLでは以下2種類のオブジェクトをデバイスメモリ空間のデータとして使用ができます。

バッファオブジェクトはC言語のmallocを、OpenCLデバイスが管理するメモリ空間での割り当てに適合しカプセル化したオブジェクトです。PyOpenCLのBufferクラスのインスタンスは、OpenCLのバッファオブジェクトと概ね同じ方法で生成し、処理に使うことができます。バッファオブジェクトを使うアプローチは第三部以降で解説します。

PyOpenCLのArrayクラスはPythonのnumpy配列に該当するプロセッサ上のメモリ空間割り当てをカプセル化したオブジェクトです。配列の操作はnumpyと類似したインターフェースが使えるため、Pythonスクリプトに慣れているがOpenCL-C言語によるカーネル関数のプログラミングができないPython開発者にとって唯一の選択肢かと思います。

Note

あくまでも2016年時点の検証ですが、pyopencl.array.Arrayをベースにした組み込み関数の実行処理速度は、numpyの組み込み関数より数倍以上遅かったので、テストや学習目的以外には使用を推奨しません。OpenCLのバッファオブジェクトのバインディングを介せば、numpyの速度の10倍以上のパフォーマンスとなるので、組み込み関数は便利なツールということでパフォーマンスに関係のない中間処理などに活用すると良いかもしれません。

Copyright 2018-2019, by Masaki Komatsu