7.2. カーネル・ソースファイル(.cl)の読み込み

注記

この項目ではMavenプロジェクトでの外部ファイルの読み込みを解説します。

OpenCLではホストプログラミングと、カーネルプログラミングの2つのソースファイルが存在しますが、JOCLではクラスファイルがホストAPIに該当し、OpenCLと同様にカーネルのソースファイルが存在します。

図:ディレクトリー構造」のディレクトリ構造には以下の「.cl」を拡張子としたファイルが2つあります。

この2つがカーネルのソースコードの入れ物となるファイルとなります。カーネルのソースコードは、JavaやCのコンパイラでコンパイルすることはできませんし、それ自体ではただの文字列を格納したテキストファイルにすぎません。従って拡張子はCソースファイルと区別するための便宜的に「.cl」としただけで、他の拡張子でも構いません。

カーネルのソースファイルはホストAPIで読み込み、そしてホストAPIの「clCreateProgramWithSource」関数を使ってプログラムオブジェクトに取り込み、「clBuildProgram」関数を使用してコンパイル・リンクを行います。

サンプルプロジェクトでは、カーネルのソースファイルをまず開きます。ソースファイル名(KERNEL_PATH変数)の設定は以下のようにしています。

private static final String KERNEL_PATH = "basic_helloworld.cl";
private static final String FUNC = "helloworld";

FUNC変数はカーネル関数の名前で、これはカーネル関数を識別するために必要となります。

ファイルを開くには以下のように「URL Class.getResource(String name)」を使います。これによりホストファイルと同じディレクトリで、KERNEL_PATHに記述したファイルを検索します。

ファイルを開いたら、Scannerを使って文字列をStringオブジェクトに読み込み、clCreateProgramWithSourceの引数として使用します。

以下がその一連の流れを記述したサンプルコードとなります。

StringBuffer sb = new StringBuffer();
URL resource = TaskTest.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");
}
/* programの生成(ファイルからOpenCL Cソースコードの読み込み) */
int[] errPtr = new int[1];
program = clCreateProgramWithSource(context,
        1, new String[]{sb.toString()}, null, errPtr);
if(errPtr[0] < 0) {
    print_error("clCreateProgramWithSource",errPtr[0]);
}
/* programのビルド(コンパイル)をします。 */
err = clBuildProgram(program, 0, null, null, null, null);

Copyright 2018-2019, by Masaki Komatsu