cl::nVidia TITAN黑色但不是Intel openCL设备上的Image3D segfault
cl::Image3D segfaults on nVidia TITAN black but not Intel openCL device?
全部,我有以下几行代码用于在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黑色的英伟达驱动程序(使用CL_DEVICE_TYPE_GPU创建上下文),代码失败并出现segfault。
所有这些都在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。
所有其他代码似乎都在英伟达设备上工作。我可以编译内核、创建上下文、缓冲区等,但这一个构造函数似乎失败了。我使用cl::Device::getInfo检查了Image3D允许的最大尺寸,它报告HxWxD限制为4096x4096x4096,所以我的16x16x1024图像尺寸远低于限制。
我还检查了一下,以确保CL_R和CL_FLOAT类型是支持的格式,它们看起来是
起初,我以为它失败了,因为我试图复制主机内存,但在我将读取的映像排入队列之前,segfault就已经发生了。
我能从gdb回溯中确定的最好的问题是,问题似乎出现在CL/CL.hp:的第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构造函数的width和height参数看起来不稳定,但我不确定这些是真实值,而且由于编译器的原因,这些值没有优化。
我的问题是:
关于nVidia卡,我有没有做错什么,不适用于英特尔CPU OpenCL驱动程序?英特尔SDK和英伟达OpenCL ICD之间是否存在已知的二进制不兼容
正如一些评论者所指出的,英伟达OpenCL实现不支持底层cl::Image构造函数使用的clCreateImage。这是因为nVidia只支持高达OpenCL 1.1的功能,而有问题的功能是OpenCL 1.2的一部分。
然而,有一种方法可以避免对代码进行重大重构。英特尔SDK中的cl.hpp支持将OpenCL 1.1用于C++OpenCL实现的封装功能。这可以通过定义CL_USE_DEPREATED_OPENCL_1_APIS来启用。
- C++中带有List类的迭代器Segfault
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- std::partition segfault issue
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- 检查nullptr是否100%保护内存布局不受segfault影响
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 为什么优化大型 std::vector 数组会导致 SegFault?
- C++segfault,可重复的例子
- 带有zip_source_buffer的libzip会导致数据损坏和/或segfault
- 导致SegFault C++的析构函数
- 从引用的Vector获取SEGFAULT
- 尝试读取/写入Graphviz DAG值的工作证明会导致segfault
- Segfault如果更改派生类的指针值
- SegFault deleting QTreeWidgetItem
- PyImport_Import segfault
- 添加#pragma循环后出现Segfault
- 使用 gmock 时的 SegFault
- C 多线程,在并行多个线程时获得SegFault
- cl::nVidia TITAN黑色但不是Intel openCL设备上的Image3D segfault