视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
OpenCL心得2
2020-11-09 07:52:38 责编:小采
文档


1.clEnqueueNDRangeKernel函数错误( Access violation reading location 0x000......... ) 后来发现原来是设置参数的时候搞疏忽掉了: mem = clCreateBuffer(context, CL_MEM_READ_WRITE, VectorLength, 0, err); clSetKernelArg(gpus[i].kernel, argIdx,

1.clEnqueueNDRangeKernel函数错误(Access violation reading location 0x000......... )

后来发现原来是设置参数的时候搞疏忽掉了:

mem = clCreateBuffer(context, CL_MEM_READ_WRITE, VectorLength, 0, &err);

clSetKernelArg(gpus[i].kernel, argIdx++, sizeof(cl_mem), mem);


这里的mem应当传递指针,而不是值,改成这样即可:

mem = clCreateBuffer(context, CL_MEM_READ_WRITE, VectorLength, 0, &err);

clSetKernelArg(gpus[i].kernel, argIdx++, sizeof(cl_mem), &mem);


这个问题只是疏忽和粗心导致的,而且它还不怎么好找到。



2.使用GPU所有显存资源和关于GPU寻址问题的解答

使用openCL时发现,GPU显存6GB,地址长度是32bit的,CL_DEVICE_MAX_MEM_ALLOC_SIZE是1GB,我就感到很怀疑,地址才32bit,它要如何寻址呢,怎么使用到6GB显存呢?


后经过实践发现,GPU的显存是根据上下文来分配的,也就是你需要对6GB显存创建6个上下文,每个上下文分别分配1GB内存即可。而不是在一个上下文里面分配6次1GB内存。所以说之前所怀疑的GPU寻址根本就不是个问题。当然,这个是说的理论,实际情况下你还得考虑是否有其他地方有使用显存(比如有的GPU启用ECC的情况下,会有12.5%的空间做ECC用,所以实际可以使用的空间只有87.5%),如果有的话,很明显就不可能使用所有的资源,在clEnqueueNDRangeKernel函数的时候会报CL_OUT_OF_RESOURCES错误的.


这个问题也说明的我对GPU内存模型缺少认识,当初在网上也没有找到能够说明这个的资料。最终还是自己实践来得最直接。



3.CL_MEM_OBJECT_ALLOCATION_FAILURE错误

首先得需要了解下GPU显存分配的时间。

a.当你执行clCreateBuffer函数的时候,你可以查看GPU-Z的显示,可以发现GPU的显存并没有占用。实际上你查看taskmgr,会发现内存使用却增加了。也就是执行clCreateBuffer的时候仅仅是在内存里面分配一块跟你要分配的数据一样大的内存,并且把数据Copy过去。所以这个时候他只会检查你想要分配的显存尺寸有没有超过CL_DEVICE_MAX_MEM_ALLOC_SIZE的,而不会去到GPU里面检查剩余空间够不够。

b.根据a你可以发现,一切显存的分配都发生在clEnqueueNDRangeKernel函数的时候,当你执行这个函数的时候,GPU的显存和使用率都起来了。也就在这个时候,如果GPU显存不够放你分配的显存的时候,问题就来了。一旦尺寸超过了,则会报CL_MEM_OBJECT_ALLOCATION_FAILURE错误,所以出现CL_MEM_OBJECT_ALLOCATION_FAILURE的时候,你应该检查clCreateBuffer创建的尺寸是否得当。

下载本文
显示全文
专题