関連するコンテキストへの参照とプログラムのソースとバイナリ、ビルドした最新の実行プログラム、ビルドオプション、ビルドログ、関連するカーネルオブジェクトの数等をカプセル化します。
プログラムオブジェクトのメインはカーネルソースコードをコンパイル・リンクすることです。この項目では組込みヘッダーや、ライブラリのリンク等、大規模なソースコードが必要なカーネルのメンテナンスに使える関数を紹介していきます。
プログラムオブジェクトについて一点指摘させて頂きます。カーネルをコンパイルしたバイナリを外部ファイルとして保存して、再度読み込む機能(関数)がクロノスグループの仕様にはありますが、これについては多くの熟練プログラマーが問題を指摘しています。
バイナリファイルのフォーマットがNVIDIA、APPLE、AMDで異なるため、クロスプラットフォームでビルドすると正常に動作するか分からない状態です。この機能を使うのがNVIDIA限定、AMD限定であるなら良いのですが、それではOpenCLの良さを消してしまいます。またオフラインコンパイラ等のツールが用意されていても、手順が複雑でOpenCLを独自にバインドしたAPIを使うこともあるため、(本書がJava/Pythonバインディングの入門書のために執筆された経緯を考えると)本書でカバーできる範囲を超えています。
バイナリの使用は各種のソースがありますが、動作させるだけでも、それなりに時間をかける作業であることは警告させて頂きます。
Java言語経験者は読む必要はありません。復習のために必要であれば目を通してください。
読者にはJavaでのファイル入出力について問題がある方は少ないとは思いますが一応おさらいをします。
まず
StringBuffer sb = new StringBuffer();
URL resource = MyApps.class.getResource(KERNEL_PATH) ; String path = Paths.get(resource.toURI()).toFile().getAbsolutePath();
Scanner sc = new Scanner(new File(path)); while(sc.hasNext()) { sb.append(sc.nextLine() + "\n"); } sc.close();
clCreateProgramWithSource関数は引数で指定したOpenCLコンテキストでプログラムオブジェクトを生成します。strings配列内の文字列からなるソースコードを、プログラムオブジェクト内にロードします。contextと関連付けられたデバイスがプログラムオブジェクトと関連付けることができます。
文字列で指定されたソースコードは、OpenCL Cプログラムのソース、ヘッダー、オンラインコンパイラをサポートするカスタムデバイスのための実装定義ソースのいずれかとなります。
詳しくは「表:clCreateProgramWithSource」(表B.62「表:clCreateProgramWithSource」)を参照ください。
cl_program org.jocl.CL.clCreateProgramWithSource( cl_context context, //(1) int count, //(2) String[] strings, //(3) long[] lengths, //(4) int[] errcode_ret) //(5)
本書ではバイナリ経由(オフライン)のプログラムオブジェクト生成は取り扱いません。ベンダー実装に依存しすぎていることが一因なのですが、著者が知るかぎりでもクロスプラットフォームをターゲットにした開発プロジェクトにおいてオフラインコンパイルは一種のはまり所と化しており、初心者向けではないと考えます。
clCreateProgramWithBinary関数は指定したOpenCLコンテキストについてプログラムオブジェクトを生成します。binariesで指定したバイナリビット列をそのプログラムオブジェクトにロードします。
詳しくは「表:clCreateProgramWithBinary」(表B.63「表:clCreateProgramWithBinary」)を参照ください。
OpenCLアプリケーションでは、プログラムソースもしくはバイナリのいずれかからプログラムオブジェクトを生成し、適切な実行可能プログラムをビルドさせることができます。
アプリケーションは、事前にビルドしたオフラインバイナリを使用、または、プログラムソースを読み込んでコンパイル・リンクした実行可能プログラムを使用するかを選択できます。
この機能はデバイスに対してプログラムを最初に実行させるときは読み込みとビルドをオンラインで行い、次回以降の実行でアプリケーションが保存していたバイナリを使用し、アプリケーション初期化に要する時間を削減できます。
cl_program org.jocl.CL.clCreateProgramWithBinary( cl_context context, //(1) int num_devices, //(2) cl_device_id[] device_list, //(3) long[] lengths, //(4) byte[][] binaries, //(5) int[] binary_status, //(6) int[] errcode_ret) //(7)
本項目は参考のために掲載しています。実装例などはありません。
clCreateProgramWithBuiltInKernels関数は引数contextに対してプログラムオブジェクトを生成します。組込みカーネルに関連した情報をプログラムオブジェクトにロードさせます。
詳しくは「表:clCreateProgramWithBuiltInKernels」(表B.64「表:clCreateProgramWithBuiltInKernels」)を参照ください。
cl_program org.jocl.CL.clCreateProgramWithBuiltInKernels( cl_context context, //(1) int num_devices, //(2) cl_device_id[] device_list, //(3) String kernel_names, //(4) int[] errcode_ret) //(5)
詳細は「表:clRetainProgram」(表B.65「表:clRetainProgram」)を参照ください。
int org.jocl.CL.clRetainProgram( cl_program program)
詳細は「表:clReleaseProgram」(表B.66「表:clReleaseProgram」)を参照ください。
int org.jocl.CL.clReleaseProgram( cl_program program)
Copyright 2018-2019, by Masaki Komatsu