当我使用clEnqueueMapBuffer从内核获取计算结果时遇到问题,它会崩溃而不会出现任何错误。我的流程在:
.
.
// Create a buffer in Host, and use CL_MEM_USE_HOST_PTR in device
int out_data;
cl_mem cl_dst = clCreateBuffer(context_CL, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(int), &out_data, &err);
.
.
//Do something in a kernel(ignore the detail of kernel and other input data, because there is no wrong there. the output is cl_dst(INT))
err = clEnqueueNDRangeKernel(....)
.
.
//Mapping the result back to the host
clEnqueueMapBuffer(queue_CL, cl_dst, CL_TRUE, CL_MAP_READ, 0, sizeof(cl_dst), 0, NULL, NULL, &err);
//And then my graphic card shut down here at this command...
.
.
.
我的显卡是Intel HD 5500(支持OpenCL 2.0) 我在某处有错误的标志或遗漏了一些重要的概念吗?
答案 0 :(得分:1)
我认为映射区域的大小不正确:
clEnqueueMapBuffer(queue_CL, cl_dst, CL_TRUE, CL_MAP_READ, 0, sizeof(cl_dst), 0, NULL, NULL, &err);
应该是:
clEnqueueMapBuffer(queue_CL, cl_dst, CL_TRUE, CL_MAP_READ, 0, sizeof(int), 0, NULL, NULL, &err);
根据OpenCL 2.0规范:
" offset和size是以字节为单位的偏移量和区域中的大小 正在映射的缓冲区对象。"