问题
In order to know the max clock frequency of a Mali T760 GPU, I used the code snippet below:
// 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
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 )
Why there's a difference between the actual clock freq reported in specs & clock freq from OpenCL query?
Edit 1:
Here's a very minimal version of the code for querying the max clock frequency of the OpenCl capable GPU device.
#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
[Platform 0] [Device 0] CL_DEVICE_MAX_CLOCK_FREQUENCY: 99 MHz
According to the OpenCL docs, there's no scaling factor. The query should return the frequency in 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.
However running the same code on an PC GPU(tested on NVIDIA & Intel GPU's) returns the expected clock frequency as per the specs.
回答1:
CPU/GPU clock speeds are often throttled for power/heat management purposes. Your GPU might be in a low power mode. 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.
回答2:
I also met the same problem. The device is Snapdragon 855 with Adreno640 GPU, whose max freq is 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!
cl_uint clockFreq = targetDevice.getInfo<CL_DEVICE_MAX_CLOCK_FREQUENCY>();
std::cout << "Max freq: " << clockFreq << " MHz" << std::endl;
来源:https://stackoverflow.com/questions/49546652/opencl-querying-max-clock-frequency-of-a-mobile-gpu-always-returns-a-lesser-va