所有,
我有以下几行代码可用于在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创建上下文),代码失败并出现段错误。

所有这些均使用最新的nVidia驱动程序,使用Intel OpenCL运行时14.1_x64_4.4.0.118和2014_4.4.0.134_x64 Intel OpenCL SDK在具有2.6.32-358内核的RHEL6.4上进行。

其他所有代码似乎都在nVidia设备上运行。我可以编译内核,创建上下文,缓冲区等,但是这个构造函数似乎失败了。我使用cl::Device::getInfo检查了Image3D允许的最大大小,它报告说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的构造函数的width和height参数看起来很奇怪,但是由于编译器的原因,我不确定这些是真实值还是未优化出值。

因此,我的问题是:

关于nVidia卡,我做错了什么,不适用于Intel CPU OpenCL驱动程序?英特尔SDK和nVidia OpenCL ICD之间是否存在已知的二进制不兼容?

最佳答案

正如一些评论者所指出的那样,nVidia OpenCL实现不支持clCreateImage,该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来启用。

关于c++ - cl::Image3D segfaults出现在nVidia TITAN黑色上,但没有Intel openCL设备?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25576055/

10-12 06:21