cl :: Image3D在nVidia TITAN黑色但不是英特尔openCL设备上的段错误?

问题描述 投票:2回答:1

全部,我有以下几行代码在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黑色的nVidia驱动程序时(通过使用CL_DEVICE_TYPE_GPU创建上下文),会失败并出现段错误。

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

所有其他代码似乎都在nVidia设备上运行。我可以编译内核,创建上下文,缓冲区等,但这一个构造函数似乎失败了。我检查了Image3D允许的最大大小是使用cl :: Device :: getInfo,并且它报告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++ opencl intel nvidia-titan
1个回答
2
投票

正如一些评论者指出的那样,nVidia OpenCL实现不支持clCreateImage,它由底层的cl :: Image构造函数使用。这是因为nVidia仅支持OpenCL 1.1,并且所讨论的函数是OpenCL 1.2的一部分。

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

© www.soinside.com 2019 - 2024. All rights reserved.