使用OpenCL,如何获得GPU内存使用?

时间:2017-12-27 08:15:41

标签: c++ opencl gpu

我正在寻找一种可靠的方法来确定OpenCL当前的GPU内存使用情况。

我找到了NVidia API:cudaMemGetInfo( size_t* free, size_t* total )来获取当前设备上的可用内存和总内存。

但我正在寻找AMD和OpenCL的解决方案。我没有发现OpenCL中是否有类似的功能,我不知道AMD是否有相同的功能。

我不想知道在分配缓冲区之前OpenCL设备上有多少可用内存,而是在分配缓冲区之后有空闲内存。 如How do I determine available device memory in OpenCL?中所示的先验,使用OpenCL,没有办法,也没有必要知道它。

1 个答案:

答案 0 :(得分:4)

  在分配缓冲区之前

设备,但在分配缓冲区之后释放空闲内容。

对于AMD,也许从cl_amd_device_attribute_query extension尝试CL_DEVICE_GLOBAL_FREE_MEMORY_AMD - 但这个扩展可能只适用于专有驱动程序。

一般情况下,这是不可能的,因为AFAIK在分配缓冲区时(设备上)无法知道。从这个意义上说,OpenCL比CUDA更高级。缓冲区属于上下文,而不是设备。调用clCreateBuffer()可以但不必在任何设备上分配任何内存;实现在执行需要这些缓冲区的内核之前自动将缓冲区迁移到设备内存,如果需要为下一个内核释放内存,则将它们从设备中移出。即使您获得了设备的空闲内存,也无法100%可靠地使用它来决定是否运行内核,因为clEnqueueNDRange()不一定立即启动内核(它只是将它排入队列;如果有的话队列中的其他东西,它可以被延迟),同时计算机上的其他一些应用程序也可以安排在GPU上。

如果你想避免交换内存,你必须确保1)你的应用程序是唯一使用GPU的应用程序,2)对于每个内核,总缓冲区参数大小必须是&lt; = GLOBAL_MEM_SIZE。< / p>