【问题标题】:With OpenCL, How to get GPU memory usage?使用 OpenCL,如何获取 GPU 内存使用情况?
【发布时间】:2018-06-07 21:20:36
【问题描述】:

我正在寻找一种可靠的方法来确定当前使用 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】:

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

对于 AMD,也许可以尝试cl_amd_device_attribute_query extension 中的 CL_DEVICE_GLOBAL_FREE_MEMORY_AMD - 不过,此扩展可能仅适用于专有驱动程序。

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

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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2020-09-26
    • 2016-06-17
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多