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

问题描述 投票:1回答:1

我正在寻找一种可靠的方法来确定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,没有办法,也没有必要知道它。

c++ opencl gpu
1个回答
4
投票

在分配缓冲区之前的设备,但是在分配缓冲区之后有空闲内存。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.