使用 OpenCL 写入 Nvidia 设备上的纹理内存

Write to texture memory on Nvidia device with OpenCL

我无法编译程序,使用 Nvidia 实现上的 write_imagef() 函数。 使用 Tesla K10.G2.8GBpython 2.7PyopenCL 2016.1 上使用驱动程序版本 367.35, 我正在尝试编译以下程序,但因构建错误而失败:

主机代码:

import pyopencl as cl

platform = cl.get_platforms()[0]
devs = platform.get_devices()
device1 = devs[1]
mf = cl.mem_flags
ctx = cl.Context([device1])
Queue1 = cl.CommandQueue(ctx)

f = open('Minimal.cl', 'r')
fstr = "".join(f.readlines())
prg = cl.Program(ctx, fstr).build()

内核 (Minimal.cl)

__kernel void test(image2d_t d_output){
    write_imagef(d_output,(int2)(1,1),(float4)(1.0f,1.0f,1.0f,1.0f));
}

我得到的错误是:

pyopencl.cffi_cl.RuntimeError: clbuildprogram failed: BUILD_PROGRAM_FAILURE -

我检查了我的设备是否支持图像并且支持读取和写入 指定格式的纹理缓冲区。我认为,同样的情况不适用于 3d 情况, 因为我们的任何 Nvidia 设备都不支持扩展名 cl_khr_3d_image_writes, 但我不明白二维案例的问题。

图像参数必须声明为 read_onlywrite_only(或 read_write with OpenCL 2.x),因此您的内核定义应如下所示:

__kernel void test(write_only image2d_t d_output){
    write_imagef(d_output,(int2)(1,1),(float4)(1.0f,1.0f,1.0f,1.0f));
}