関連するコンテキストへの参照とプログラムのソースとバイナリ、ビルドした最新の実行プログラム、ビルドオプション、ビルドログ、関連するカーネルオブジェクトの数等をカプセル化します。
プログラムオブジェクトのメインはカーネルソースコードをコンパイル・リンクすることです。この項目では組込みヘッダーや、ライブラリのリンク等、大規模なソースコードが必要なカーネルのメンテナンスに使える関数を紹介していきます。
プログラムオブジェクトについて一点指摘させて頂きます。カーネルをコンパイルしたバイナリを外部ファイルとして保存して、再度読み込む機能(関数)がクロノスグループの仕様にはありますが、これについては多くの熟練プログラマーが問題を指摘しています。
バイナリファイルのフォーマットがNVIDIA、APPLE、AMDで異なるため、クロスプラットフォームでビルドすると正常に動作するか分からない状態です。この機能を使うのがNVIDIA限定、AMD限定であるなら良いのですが、それではOpenCLの良さを消してしまいます。またオフラインコンパイラ等のツールが用意されていても、手順が複雑でOpenCLを独自にバインドしたAPIを使うこともあるため、(本書がJava/Pythonバインディングの入門書のために執筆された経緯を考えると)本書でカバーできる範囲を超えています。
バイナリの使用は各種のソースがありますが、動作させるだけでも、それなりに時間をかける作業であることは警告させて頂きます。
Programはコンストラクタの引数で指定したOpenCLコンテキストでプログラムオブジェクトを生成します。src配列内の文字列からなるソースコードを、プログラムオブジェクト内にロードします。contextと関連付けられたデバイスがプログラムオブジェクトと関連付けることができます。
文字列で指定されたソースコードは、OpenCL Cプログラムのソース、ヘッダー、オンラインコンパイラをサポートするカスタムデバイスのための実装定義ソースのいずれかとなります。
詳しくは「表:clCreateProgramWithSource」(Table B.62, “表:clCreateProgramWithSource”)を参照ください。
class pyopencl.Program( context, #(1) src) #(2)
class pyopencl.Program(context, devices, binaries)
Copyright 2018-2019, by Masaki Komatsu