9.12. プログラムオブジェクト

関連するコンテキストへの参照とプログラムのソースとバイナリ、ビルドした最新の実行プログラム、ビルドオプション、ビルドログ、関連するカーネルオブジェクトの数等をカプセル化します。

プログラムオブジェクトのメインはカーネルソースコードをコンパイル・リンクすることです。この項目では組込みヘッダーや、ライブラリのリンク等、大規模なソースコードが必要なカーネルのメンテナンスに使える関数を紹介していきます。

重要

プログラムオブジェクトについて一点指摘させて頂きます。カーネルをコンパイルしたバイナリを外部ファイルとして保存して、再度読み込む機能(関数)がクロノスグループの仕様にはありますが、これについては多くの熟練プログラマーが問題を指摘しています。

バイナリファイルのフォーマットがNVIDIA、APPLE、AMDで異なるため、クロスプラットフォームでビルドすると正常に動作するか分からない状態です。この機能を使うのがNVIDIA限定、AMD限定であるなら良いのですが、それではOpenCLの良さを消してしまいます。またオフラインコンパイラ等のツールが用意されていても、手順が複雑でOpenCLを独自にバインドしたAPIを使うこともあるため、(本書がJava/Pythonバインディングの入門書のために執筆された経緯を考えると)本書でカバーできる範囲を超えています。

バイナリの使用は各種のソースがありますが、動作させるだけでも、それなりに時間をかける作業であることは警告させて頂きます。

9.12.1. カーネルソースファイルの読み込みの復習

注記

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();

9.12.2. clCreateProgramWithSource

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)

(1)

有効なOpenCLコンテキストを指定。

(2)

ポインタの数

(3)

ソースコードが格納された文字列へのポインタの配列を指定。任意にソースコードの文字列がNULL終端とすることができる。

(4)

(strings配列内の)各文字列の文字数を指定する配列。

(5)

適切なエラーコードが設定される。

9.12.3. clCreateProgramWithBinary

警告

本書ではバイナリ経由(オフライン)のプログラムオブジェクト生成は取り扱いません。ベンダー実装に依存しすぎていることが一因なのですが、著者が知るかぎりでもクロスプラットフォームをターゲットにした開発プロジェクトにおいてオフラインコンパイルは一種のはまり所と化しており、初心者向けではないと考えます。

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)

(1)

有効なOpenCLコンテキストを指定。

(2)

device_listで指定したデバイスの数を指定。

(3)

context内のデバイス一覧へのポインタを指定。

(4)

device_listで指定したデバイスのためにロードされるプログラムバイナリのバイトサイズの配列を指定。

(5)

device_listで指定したデバイスのために読み込まれるプログラムバイナリへのポインタの配列を指定。

(6)

device_list内の各デバイスに対するプログラムバイナリのロードが成否を戻す。

(7)

適切なエラーコードを戻す。

9.12.4. clCreateProgramWithBuiltInKernels

警告

本項目は参考のために掲載しています。実装例などはありません。

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)

(1)

有効なOpenCLコンテキストを指定。

(2)

device_listにあるデバイスの個数を指定。

(3)

コンテキスト内のデバイスリストを指すポインタ。

(4)

セミコロン要素区切りの、組込みカーネルの名称のリスト。

(5)

適切なエラーコードを戻す。

9.12.5. clRetainProgram

注記

詳細は「表:clRetainProgram」(表B.65「表:clRetainProgram」)を参照ください。

int org.jocl.CL.clRetainProgram(
    cl_program program)

9.12.6. clReleaseProgram

注記

詳細は「表:clReleaseProgram」(表B.66「表:clReleaseProgram」)を参照ください。

int org.jocl.CL.clReleaseProgram(
    cl_program program)

Copyright 2018-2019, by Masaki Komatsu