16.11. プログラムオブジェクトのクエリ

16.11.1. get_info

get_info関数はプログラムオブジェクトについての情報を取得します。

Note

詳しくは「表:clGetProgramInfo」(Table B.73, “表:clGetProgramInfo”)と「表:cl_program_info」(Table B.74, “表:cl_program_info”)を参照ください。

get_info(param)

paramにはpyopencl.program_infoのビットフィールドの値を指定します。

import pyopencl as cl
import numpy as np

data = np.arange(16).astype(np.int32)

devices = [cl.get_platforms()[0].get_devices(cl.device_type.GPU)[0]]

ctx = cl.Context(devices)
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
data_mem = cl.Buffer(ctx, mf.USE_HOST_PTR, hostbuf=data)

program = cl.Program(ctx, """
    __kernel void square(__global int* data) {
        size_t gid = get_global_id(0);
        data[gid] *= data[gid];
        printf("%d\\n", data[gid]);
    }
    """).build()

num_devices = program.get_info(cl.program_info.NUM_DEVICES)

print(num_devices)

出力は以下のようになります。

1

GPUデバイスは一つなので正しい値の出力が確認できました。

さらに他の情報も取得できるか確認をしてみます。

binary_sizes = program.get_info(cl.program_info.BINARY_SIZES)

print(binary_sizes)

kernel_names = program.get_info(cl.program_info.KERNEL_NAMES)

print(kernel_names)

reference_count = program.get_info(cl.program_info.REFERENCE_COUNT)

print(reference_count)

上記のプログラムの出力は以下のようになります。

[2494]
square
1

プログラムのサイズが2494バイト、カーネル名がsquare、プログラムのインスタンスが一つなので合っています。

16.11.2. cl_program_info

get_infoの引数となるビットフィールドとして指定します。

Note

詳しくは「表:clGetProgramInfo」(Table B.73, “表:clGetProgramInfo”)と「表:cl_program_info」(Table B.74, “表:cl_program_info”)を参照ください。

class pyopencl.program_info

program_infoのビットフィールドは以下の表にある値があります。

Table 16.3. pyopencl.program_info

BINARIES
BINARY_SIZES
CONTEXT
DEVICES
KERNEL_NAMES
NUM_DEVICES
NUM_KERNELS
REFERENCE_COUNT
SOURCE

16.11.3. get_build_info

get_build_info関数はプログラムオブジェクト内の各デバイスについてのビルド情報を取得します。

Note

詳しくは「表:cl_program_build_info」(Table B.76, “表:cl_program_build_info”)と「表:clGetProgramBuildInfo」(Table B.75, “表:clGetProgramBuildInfo”)を参照ください。

get_build_info(
    device, #(1)
    param) #(2)

(1)

ビルド情報を取得するOpenCLデバイスを指定。programと関連付けられた有効なデバイスとなる必要がある。

(2)

pyopencl.program_build_infoのビットフィールドを指定。

ビルド時のオプションを指定してからビルド情報を取得してみたいと思います。以下がpythonのソースコードです。

import pyopencl as cl
import numpy as np

data = np.arange(16).astype(np.int32)

devices = [cl.get_platforms()[0].get_devices(cl.device_type.GPU)[0]]

ctx = cl.Context(devices)
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
data_mem = cl.Buffer(ctx, mf.USE_HOST_PTR, hostbuf=data)

program = cl.Program(ctx, """
    __kernel void square(__global int* data) {
        size_t gid = get_global_id(0);
        data[gid] *= data[gid];
        printf("%d\\n", data[gid]);
    }
    """).build(options=["-Dsize=256"], cache_dir="cache")

options = program.get_build_info(devices[0], cl.program_build_info.OPTIONS)

print(options)

プログラムの出力は以下のようになります。

-Dsize=256 -I /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pyopencl-2016.2-py3.5-macosx-10.6-intel.egg/pyopencl/cl

指定したプログラムのオプションと、インクルードディレクトリが表示されました。

16.11.4. program_build_info

program_build_infoクラスはget_build_infoで指定する取得情報を表すビットフィールドの値を持ちます。

Note

詳しくは「表:cl_program_build_info」(Table B.76, “表:cl_program_build_info”)と「表:clGetProgramBuildInfo」(Table B.75, “表:clGetProgramBuildInfo”)を参照ください。

class pyopencl.program_build_info

program_build_infoのビットフィールドの値は下表の通りです。

Table 16.4. pyopencl.program_build_info

BINARY_TYPE
GLOBAL_VARIABLE_TOTAL_SIZE(2.0)
LOG
OPTIONS
STATUS

Copyright 2018-2019, by Masaki Komatsu