所有,我有以下代码行用于在 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 之间是否存在已知的二进制不兼容?