【问题标题】:OpenCL program freezes when using GPU使用 GPU 时 OpenCL 程序冻结
【发布时间】:2015-06-23 14:47:11
【问题描述】:

我的程序不能同时使用 CPU 和 GPU:

ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_CPU, 1, &device_id, &ret_num_devices);
ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices);

使用 CPU 时,我收到以下消息:

0x000007FEE30E8F90 (amdocl64.dll) 中的第一次机会异常 Project2.exe:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。如果有此异常的处理程序,则 程序可以安全地继续。

执行此命令时出现问题:

ret = clEnqueueReadBuffer(command_queue, Cmobj, CL_TRUE, 0,
K*L*sizeof(float), C, 0, NULL, NULL);

当使用GPU程序执行此命令时冻结:

ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);

内存有问题吗?或者是其他东西? 我使用 Visual Studio 2012、AMD Radeon HD 6470M、AMD APP SDK 2.9-1

【问题讨论】:

  • 鉴于您收到内存访问冲突错误代码 (0xC0000005),这两种实现的共同点在不应该出现的情况下为 null。

标签: c++ opencl gpu


【解决方案1】:

你是如何初始化device_idret_num_devices的?

通常,您需要调用两次clGetDeviceIDs:首先获取可用设备的数量,然后为设备 ID 分配内存,然后再次调用它以填充该内存,如下所示:

cl_uint       numDevices = 0;
cl_device_id  *devices;
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0, NULL, &numDevices);    
if (numDevices > 0)
{
    devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
    status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
}
else
{
  // error: no device available: exit or fall back to CPU ...      
}

// use any of the devices[0 .. numDevices-1]
// after compiling/loading the kernel, you can free(devices)

APP SDK 附带的一些示例也显示了这种模式,例如 samples/opencl/cl/app/HelloWorld/HelloWorld.cpp。也许您只是使用其中一个示例并根据您的需要进行调整?

【讨论】:

  • 是的,我刚刚根据需要调整了示例代码 (HelloWorld.cpp)。所以实际上我这样初始化device_idret_num_devicescl_device_id device_id = NULL; cl_uint ret_num_devices; cl_int ret; ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, &ret_num_devices); 就是这样,在我的代码中没有两次调用clGetDeviceIDs
  • 你检查retret_num_devices是什么?同样对于所有其他 OpenCL 初始化调用,您是否检查返回码?
  • 我检查了它,ret 始终保持为零,ret_num_devices 保持 1。我用你的代码替换了我的代码,我的程序运行正常,但 clBuildProgram 真的很慢。它的执行大约需要 5 分钟。可能之前比较慢,只是没注意……我觉得不应该是这样的。这个功能正常吗?
  • 同意;我认为该平台不是 AMD 或 Intel,所以没有 CPU 设备。第一次通话时ret 的值是多少?
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 2013-12-19
  • 2014-05-30
  • 2014-04-04
  • 1970-01-01
  • 2020-03-26
  • 2023-04-10
  • 2012-08-17
相关资源
最近更新 更多