cl::nVidia TITAN黑色但不是Intel openCL设备上的Image3D segfault

cl::Image3D segfaults on nVidia TITAN black but not Intel openCL device?

本文关键字:Image3D segfault openCL TITAN nVidia 黑色 cl Intel      更新时间:2023-10-16

全部,我有以下几行代码用于在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黑色的英伟达驱动程序(使用CL_DEVICE_TYPE_GPU创建上下文),代码失败并出现segfault。

所有这些都在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。

所有其他代码似乎都在英伟达设备上工作。我可以编译内核、创建上下文、缓冲区等,但这一个构造函数似乎失败了。我使用cl::Device::getInfo检查了Image3D允许的最大尺寸,它报告HxWxD限制为4096x4096x4096,所以我的16x16x1024图像尺寸远低于限制。

我还检查了一下,以确保CL_R和CL_FLOAT类型是支持的格式,它们看起来是

起初,我以为它失败了,因为我试图复制主机内存,但在我将读取的映像排入队列之前,segfault就已经发生了。

我能从gdb回溯中确定的最好的问题是,问题似乎出现在CL/CL.hp:的第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卡,我有没有做错什么,不适用于英特尔CPU OpenCL驱动程序?英特尔SDK和英伟达OpenCL ICD之间是否存在已知的二进制不兼容

正如一些评论者所指出的,英伟达OpenCL实现不支持底层cl::Image构造函数使用的clCreateImage。这是因为nVidia只支持高达OpenCL 1.1的功能,而有问题的功能是OpenCL 1.2的一部分。

然而,有一种方法可以避免对代码进行重大重构。英特尔SDK中的cl.hpp支持将OpenCL 1.1用于C++OpenCL实现的封装功能。这可以通过定义CL_USE_DEPREATED_OPENCL_1_APIS来启用。