C++ OpenCL程序在使用GPU时冻结

C++ OpenCL程序在使用GPU时冻结,c++,opencl,gpu,C++,Opencl,Gpu,我的程序不能同时使用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(am

我的程序不能同时使用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:访问冲突读取位置 0xFFFFFFFFFFFFFF。如果存在此异常的处理程序,则 程序可以安全地继续

执行此命令时出现问题:

ret = clEnqueueReadBuffer(command_queue, Cmobj, CL_TRUE, 0,
K*L*sizeof(float), C, 0, NULL, NULL);
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
使用GPU时,执行此命令时程序冻结:

ret = clEnqueueReadBuffer(command_queue, Cmobj, CL_TRUE, 0,
K*L*sizeof(float), C, 0, NULL, NULL);
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
内存有问题吗?还是别的什么?
我使用的是Visual Studio 2012、AMD Radeon HD 6470M、AMD APP SDK 2.9-1

您是如何初始化设备id和设备数量的

通常,您需要调用
clgetDeviceID
两次:首先获取可用设备的数量,然后为设备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)

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

鉴于您得到的是内存访问冲突错误代码(0xC0000005),两个实现的共同点在不应该为空时为空。是的,我只是根据需要调整了示例代码(HelloWorld.cpp)。所以事实上,我用这种方式初始化
device\u id
ret\u num\u devices
cl\u device\u id device\u id=NULL;氯离子交换装置;cl_int ret;ret=CLGetDeviceID(平台id、CL设备类型、GPU、1、设备id和ret设备数量)就是这样,在我的代码中没有两次调用
clgetDeviceID
。您是否检查
ret
ret\u num\u设备是什么?另外,对于所有其他OpenCL初始化调用,您是否检查返回代码?我检查了它,并且
ret
is始终保持为零,
ret\u num\u devices
保持为1。我用你的代码替换了我的代码,我的程序工作正常,但是
clBuildProgram
非常慢。它的执行大约需要5分钟。也许以前很慢,我只是没注意到。。。我不认为这应该是那样的。这个功能正常吗?同意;我认为这个平台不是AMD或Intel,所以没有CPU设备。您第一次通话的
ret
值是多少?