2

所有,我有以下代码行用于在 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 black 的 nVidia 驱动程序时(通过使用 CL_DEVICE_TYPE_GPU 创建上下文),代码运行良好。

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

所有其他代码似乎都在 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 的构造函数的宽度和高度参数看起来很奇怪,但我不确定这些是真实值,也不是由于编译器而优化的值。

我的问题是:

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

4

1 回答 1

2

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

但是,有一种方法可以解决这个问题,而无需对代码进行重大重构。英特尔 SDK 中的 cl.hpp 支持将 OpenCL 1.1 用于 C++ openCL 实施的包装功能。这可以通过定义 CL_USE_DEPRECATED_OPENCL_1_1_APIS 来启用。

于 2014-09-02T15:08:53.323 回答