简体   繁体   English

OpenCL:查询移动 GPU 的最大时钟频率总是返回较小的值

[英]OpenCL : Querying max clock frequency of a mobile GPU always returns a lesser value

In order to know the max clock frequency of a Mali T760 GPU, I used the code snippet below:为了了解 Mali T760 GPU 的最大时钟频率,我使用了以下代码片段:

// Get device max clock frequency
cl_uint max_clock_freq;
err_num = clGetDeviceInfo(cl_devices[device_idx], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(max_clock_freq), &max_clock_freq, NULL);
check_cl_error(err_num, "clGetDeviceInfo: Getting device max clock frequency");
printf("CL_DEVICE_MAX_CLOCK_FREQUENCY: %d MHz\n", max_clock_freq);

Full source code available here: https://github.com/sivagnanamn/opencl-device-info此处提供完整源代码: https : //github.com/sivagnanamn/opencl-device-info

The query result shows CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz whereas the clock freq reported in the specs is 600MHz (src: https://www.notebookcheck.net/ARM-Mali-T760-MP4.148383.0.html )查询结果显示CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz而规范中报告的时钟频率为 600MHz (src: https://www.notebookcheck.net/ARM-Mali-T760-MP4.148383.0.html )

Why there's a difference between the actual clock freq reported in specs & clock freq from OpenCL query?为什么 OpenCL 查询的规范和时钟频率中报告的实际时钟频率之间存在差异?

Edit 1:编辑1:

Here's a very minimal version of the code for querying the max clock frequency of the OpenCl capable GPU device.这是用于查询支持 OpenCl 的 GPU 设备的最大时钟频率的代码的最小版本。

#include <stdio.h>
#include <stdlib.h>

#ifdef __APPLE__
  #include <OpenCL/opencl.h>
#else
  #include <CL/cl.h>
#endif

void check_cl_error(cl_int err_num, char* msg) {
  if(err_num != CL_SUCCESS) {
    printf("[Error] OpenCL error code: %d in %s \n", err_num, msg);
    exit(EXIT_FAILURE);
  }
}

int main(void) {

  cl_int err_num;
  char str_buffer[1024];
  cl_uint num_platforms_available;

  // Get the number of OpenCL capable platforms available
  err_num = clGetPlatformIDs(0, NULL, &num_platforms_available);

  // Exit if no OpenCL capable platform found
  if(num_platforms_available == 0){
    printf("No OpenCL capable platforms found ! \n");
    return EXIT_FAILURE;
  }

  // Create a list for storing the platform id's
  cl_platform_id cl_platforms[num_platforms_available];

  err_num = clGetPlatformIDs(num_platforms_available, cl_platforms, NULL);
  check_cl_error(err_num, "clGetPlatformIDs: Getting available platform id's");

  // Get attributes of each platform available
  for(int platform_idx = 0; platform_idx < num_platforms_available; platform_idx++) {

    // Get the number of OpenCL supported device available in this platform
    cl_uint num_devices_available;
    err_num = clGetDeviceIDs(cl_platforms[platform_idx], CL_DEVICE_TYPE_ALL, 0, NULL, &num_devices_available);
    check_cl_error(err_num, "clGetDeviceIDs: Get number of OpenCL supported devices available");

    cl_device_id cl_devices[num_devices_available];
    err_num = clGetDeviceIDs(cl_platforms[platform_idx], CL_DEVICE_TYPE_ALL, num_devices_available, cl_devices, NULL);
    check_cl_error(err_num, "clGetDeviceIDs: Getting available OpenCL capable device id's");

    // Get attributes of each device
    for(int device_idx = 0; device_idx < num_devices_available; device_idx++) {

      // Get device max clock frequency
      cl_uint max_clock_freq;
      err_num = clGetDeviceInfo(cl_devices[device_idx], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(max_clock_freq), &max_clock_freq, NULL);
      check_cl_error(err_num, "clGetDeviceInfo: Getting device max clock frequency");
      printf("[Platform %d] [Device %d] CL_DEVICE_MAX_CLOCK_FREQUENCY: %d MHz\n", platform_idx, device_idx, max_clock_freq);
    }
  }

  return 0;
}

The output I get after executing on ASUS TinkerBoard with Mali T760 GPU is在使用 Mali T760 GPU 的 ASUS TinkerBoard 上执行后我得到的输出是

[Platform 0] [Device 0] CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz

According to the OpenCL docs, there's no scaling factor.根据 OpenCL 文档,没有缩放因子。 The query should return the frequency in MHz ( https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html )查询应以 MHz 为单位返回频率( https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html

Excerpt from the OpenCL docs: CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint - Maximum configured clock frequency of the device in MHz.摘自 OpenCL 文档: CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint - 设备的最大配置时钟频率(以 MHz 为单位)。

However running the same code on an PC GPU(tested on NVIDIA & Intel GPU's) returns the expected clock frequency as per the specs.但是,在 PC GPU 上运行相同的代码(在 NVIDIA 和 Intel GPU 上测试)会根据规范返回预期的时钟频率。

CPU/GPU clock speeds are often throttled for power/heat management purposes. CPU/GPU 时钟速度通常会出于电源/热量管理目的而受到限制。 Your GPU might be in a low power mode.您的 GPU 可能处于低功耗模式。 If you programatically change the power mode however, be careful not to exceed the specs for your board configuration.但是,如果您以编程方式更改电源模式,请注意不要超出电路板配置的规格。 Sometimes these development boards don't come with adequate heat sinks for max clock rates.有时,这些开发板没有配备足够的散热器来实现最大时钟速率。

I also met the same problem.我也遇到了同样的问题。 The device is Snapdragon 855 with Adreno640 GPU, whose max freq is 585MHz.该设备是带有 Adreno640 GPU 的 Snapdragon 855,其最大频率为 585MHz。 I have make it to the max clock rates firstly.我首先达到了最大时钟频率。 Then use code to get max clock rate.然后使用代码获得最大时钟速率。 But the result is 1 MHz!但结果是 1 MHz!

cl_uint clockFreq = targetDevice.getInfo<CL_DEVICE_MAX_CLOCK_FREQUENCY>();
std::cout << "Max freq: " << clockFreq << " MHz" << std::endl;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM