【问题标题】:GPU usage in opencl programopencl 程序中的 GPU 使用情况
【发布时间】:2020-09-26 13:59:04
【问题描述】:

我在编写opencl内核时有一个关于GPU使用的问题:我有自己编写的这个程序,目标是拍摄图像然后应用过滤器,程序按我的意愿工作,过滤器应用正确但我不知道操作是由 CPU 完成还是由 GPU 完成,因为任务管理器说 GPU 使用率为 0%。会不会是程序太快了,任务管理器检测不到GPU使用情况(图片没那么大)?有什么方法可以检查 GPU 是否正常工作?谢谢

【问题讨论】:

  • 这很简单:在无限循环中一遍又一遍地过滤此图像。在现代 GPU 上只执行一次可能需要一毫秒或更短的时间,所以这基本上没有负载。

标签: c parallel-processing opencl


【解决方案1】:

Windows 10 任务管理器无法正确显示某些 OpenCL 程序的 GPU 使用情况。在某些情况下,您会在“3D”选项卡中看到正确的使用编号,有时在“Compute_0”选项卡中,有时在“Cuda”选项卡中,有时根本看不到。当“3D”选项卡以外的选项卡显示正确百分比时,概览左侧仍显示 0%。 使用显示是否正确取决于驱动程序版本,甚至取决于您在 OpenCL 内核中使用的指令。 Windows 任务管理器从WDDM 估计其 GPU 数量。

要获得更可靠的读数(以及内存带宽使用情况、GPU 温度等),请使用 nvidia-smirocm-smi,这些工具更准确。

【讨论】:

    【解决方案2】:

    您可以非常精确地控制运行内核的设备。创建 OpenCL 上下文时,请务必在使用适当的过滤器枚举它们后指定特定的设备 ID。

    例如:

    cl_device_id device_ids[5] = {};
    cl_uint num = 0;
    cl_int err = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, 5, device_ids, &num);
    // This will limit to GPU devices only ----------^^^
    // Don't forget to actually check & handle any error here.
    //
    // ... make sure at least 1 device was returned, get device information and
    // use it to choose a device ...
    cl_device_id device_id = device_ids[0]; // most trivial selection: just pick the first device
    
    cl_context context = clCreateContext(NULL, 1, &device_id, report_cl_error, NULL, &err);
    // any kernels run on this context will run on ^^this^^^ selected GPU
    

    我从未遇到过或听说过没有在所选设备上运行内核的 OpenCL 实现。

    如果任何 GPU 使用指标显示为 0%,则原因可能是您所怀疑的,或者指标本身使用了一些不完善的度量。例如,OpenCL 的使用可能不计入其中。

    【讨论】:

    • 是的,我和你写的完全一样,我在创建上下文时指定了 GPU,但使用量总是 0,这很奇怪,还是谢谢你
    猜你喜欢
    • 2018-06-07
    • 2016-02-25
    • 2015-06-23
    • 2011-08-04
    • 2018-09-10
    • 2013-12-19
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多