OpenCL:查询移动 GPU 的最大时钟频率总是 returns 一个较小的值
OpenCL : Querying max clock frequency of a mobile GPU always returns a lesser value
为了了解 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);
此处提供完整的源代码:https://github.com/sivagnanamn/opencl-device-info
查询结果显示 CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz
而规格中报告的时钟频率为 600MHz (src: https://www.notebookcheck.net/ARM-Mali-T760-MP4.148383.0.html )
为什么规范中报告的实际时钟频率与 OpenCL 查询的时钟频率之间存在差异?
编辑 1:
这是用于查询支持 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;
}
我在使用 Mali T760 GPU 的 ASUS TinkerBoard 上执行后得到的输出是
[Platform 0] [Device 0] CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz
根据 OpenCL 文档,没有比例因子。查询应该 return 以 MHz 为单位的频率 (https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html)
OpenCL 文档摘录:
CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint - 设备的最大配置时钟频率(以 MHz 为单位)。
然而 运行 PC GPU 上的相同代码(在 NVIDIA 和英特尔 GPU 上测试)returns 符合规范的预期时钟频率。
CPU/GPU 时钟速度通常出于 power/heat 管理目的而受到限制。您的 GPU 可能处于低功耗模式。但是,如果您以编程方式更改电源模式,请注意不要超出电路板配置的规格。有时这些开发板没有为最大时钟速率配备足够的散热器。
我也遇到了同样的问题。该设备是带有 Adreno640 GPU 的 Snapdragon 855,其最大频率为 585MHz。我首先达到了最大时钟速率。然后使用代码获得最大时钟速率。 但是结果是1MHz!
cl_uint clockFreq = targetDevice.getInfo<CL_DEVICE_MAX_CLOCK_FREQUENCY>();
std::cout << "Max freq: " << clockFreq << " MHz" << std::endl;
为了了解 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);
此处提供完整的源代码:https://github.com/sivagnanamn/opencl-device-info
查询结果显示 CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz
而规格中报告的时钟频率为 600MHz (src: https://www.notebookcheck.net/ARM-Mali-T760-MP4.148383.0.html )
为什么规范中报告的实际时钟频率与 OpenCL 查询的时钟频率之间存在差异?
编辑 1:
这是用于查询支持 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;
}
我在使用 Mali T760 GPU 的 ASUS TinkerBoard 上执行后得到的输出是
[Platform 0] [Device 0] CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz
根据 OpenCL 文档,没有比例因子。查询应该 return 以 MHz 为单位的频率 (https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clGetDeviceInfo.html)
OpenCL 文档摘录: CL_DEVICE_MAX_CLOCK_FREQUENCY - cl_uint - 设备的最大配置时钟频率(以 MHz 为单位)。
然而 运行 PC GPU 上的相同代码(在 NVIDIA 和英特尔 GPU 上测试)returns 符合规范的预期时钟频率。
CPU/GPU 时钟速度通常出于 power/heat 管理目的而受到限制。您的 GPU 可能处于低功耗模式。但是,如果您以编程方式更改电源模式,请注意不要超出电路板配置的规格。有时这些开发板没有为最大时钟速率配备足够的散热器。
我也遇到了同样的问题。该设备是带有 Adreno640 GPU 的 Snapdragon 855,其最大频率为 585MHz。我首先达到了最大时钟速率。然后使用代码获得最大时钟速率。 但是结果是1MHz!
cl_uint clockFreq = targetDevice.getInfo<CL_DEVICE_MAX_CLOCK_FREQUENCY>();
std::cout << "Max freq: " << clockFreq << " MHz" << std::endl;