cl::Image3D segfaults on nVidia TITAN black 但不是 Intel openCL 设备?
Posted
技术标签:
【中文标题】cl::Image3D segfaults on nVidia TITAN black 但不是 Intel openCL 设备?【英文标题】:cl::Image3D segfaults on nVidia TITAN black but not Intel openCL device? 【发布时间】:2014-10-23 22:11:28 【问题描述】:所有, 我有以下代码行用于在 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 之间是否存在已知的二进制不兼容问题?
【问题讨论】:
是否使用 C API 工作? 那里有几个不同的cl.hpp
s,你能告诉我们你的第4074行吗?我的猜测是它正在尝试使用clCreateImage
,这不会在 NVIDIA 平台上实现。
如果没有实现,如何在nVidia上创建图像? O_o 不能用clCreateImage好像就打破了ABI的思路吧?
C API 是否有效?
@stix, clCreateImage
是 NVIDIA 尚不支持的 OpenCL 1.2 的新功能。在 1.0 和 1.1 中有 clCreateImage2D
和 clCreateImage3D
,NVIDIA 确实实现了它们。 C++ 包装器可能使用的是 1.2 版本,而不是旧版本。
【参考方案1】:
正如一些评论者所指出的,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 来启用。
【讨论】:
以上是关于cl::Image3D segfaults on nVidia TITAN black 但不是 Intel openCL 设备?的主要内容,如果未能解决你的问题,请参考以下文章