全部, 我有以下几行代码在OpenCL中设置3D图像:
const size_t NPOLYORDERS = 16;
const size_t NPOLYBINS = 1024;
cl::Image3D my3DImage;
cl::ImageFormat imFormat(CL_R, CL_FLOAT);
my3Dimage = cl::Image3D(clContext, CL_MEM_READ_ONLY, imFormat, NPOLYORDERS, NPOLYORDERS, NPOLYBINS);
当我使用Intel OpenCL CPU驱动程序(通过使用CL_DEVICE_TYPE_CPU创建上下文)时,代码运行正常,但当我使用带有TITAN黑色的nVidia驱动程序时(通过使用CL_DEVICE_TYPE_GPU创建上下文),会失败并出现段错误。
所有这些都在RHEL6.4上,2.6.32-358内核使用最新的nVidia驱动程序,使用Intel OpenCL运行时14.1_x64_4.4.0.118和2014_4.4.0.134_x64 Intel OpenCL SDK。
所有其他代码似乎都在nVidia设备上运行。我可以编译内核,创建上下文,缓冲区等,但这一个构造函数似乎失败了。我检查了Image3D允许的最大大小是使用cl :: Device :: getInfo,并且它报告HxWxD限制为4096x4096x4096,因此我的16x16x1024图像大小远低于限制。
我还检查过以确保CL_R和CL_FLOAT类型是支持的格式,它们似乎是。
起初我以为它因为尝试复制主机内存而失败了,但是在我甚至将图像排入队列之前就发生了段错误。
我能够从我的gdb回溯中确定最好的问题是问题出现在CL / cl.hpp的第4074行:
#0 0x000000000000 in ?? ()
#1 0x00000000004274fe in cl::Image3D::Image3D (this=0x7fffffffffdcb0, context=...,
flags=140737488345384, format=..., width=0, height=140737488345392, depth=1024, row_pitch=0,
slice_pitch=0, host_ptr=0x0, err=0x0) at /usr/include/CL/cl.hpp:4074
#2 0x0000000000421986 in clCorrelationMatrixGenerator::initializeOpenCL (
this=0x7fffffffffdfa8) at ./libs/matrix_generator/OpenCLMatrixGenerator.cc:194
正如您所看到的,Image3D的构造函数的宽度和高度参数看起来很糟糕,但我不确定这些是真正的值,并且由于编译器而没有优化输出值。
我的问题是:
对于nVidia卡,我有什么问题吗?这不适用于Intel CPU OpenCL驱动程序吗?英特尔SDK和nVidia OpenCL ICD之间是否存在已知的二进制不兼容性?
答案 0 :(得分:2)
正如一些评论者指出的那样,nVidia OpenCL实现不支持clCreateImage,它由底层的cl :: Image构造函数使用。这是因为nVidia仅支持OpenCL 1.1,并且所讨论的函数是OpenCL 1.2的一部分。
然而,有一种方法可以解决这个问题,而不需要对代码进行重大修改。英特尔SDK中的cl.hpp支持使用OpenCL 1.1来实现C ++ openCL实现的包装功能。可以通过定义CL_USE_DEPRECATED_OPENCL_1_1_APIS来启用此功能。