【问题标题】:cl::Image3D segfaults on nVidia TITAN black but not Intel openCL device?cl::Image3D segfaults on nVidia TITAN black 但不是 Intel openCL 设备?
【发布时间】: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.hpps,你能告诉我们你的第4074行吗?我的猜测是它正在尝试使用clCreateImage,这不会在 NVIDIA 平台上实现。
  • 如果没有实现,如何在nVidia上创建图像? O_o 不能用clCreateImage好像就打破了ABI的思路吧?
  • C API 是否有效?
  • @stix, clCreateImage 是 NVIDIA 尚不支持的 OpenCL 1.2 的新功能。在 1.0 和 1.1 中有 clCreateImage2DclCreateImage3D,NVIDIA 确实实现了它们。 C++ 包装器可能使用的是 1.2 版本,而不是旧版本。

标签: c++ opencl intel nvidia-titan


【解决方案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 来启用。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2021-07-26
    • 1970-01-01
    • 2015-06-02
    • 2018-07-21
    • 2014-08-03
    • 2013-05-12
    • 2016-02-26
    • 2014-07-02
    相关资源
    最近更新 更多