1. 初始化Mali GPU计算环境
任务说明
本案例目标是在Mali GPU上建立OpenCL计算环境:枚举平台与设备、查询设备关键信息、创建上下文与命令队列,并输出验证信息。代码基于OpenCL 1.2标准,适用于Mali-T860/Mali-G72等支持OpenCL的Mali GPU。
实现代码
#include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>
#define CHECK(err, msg) \
if (err != CL_SUCCESS) { \
fprintf(stderr, "Error: %s (code %d)\n", msg, err); \
exit(1); \
}
int main() {
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_command_queue queue;
cl_int err;
// 1. 获取平台
err = clGetPlatformIDs(1, &platform, NULL);
CHECK(err, "clGetPlatformIDs");
// 2. 获取Mali GPU设备
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
CHECK(err, "clGetDeviceIDs (GPU)");
// 3. 查询设备信息
char name[128], vendor[128], version[128];
cl_uint max_compute_units;
size_t max_work_group_size;
cl_ulong global_mem_size;
clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(name), name, NULL);
clGetDeviceInfo(device, CL_DEVICE_VENDOR, sizeof(vendor), vendor, NULL);
clGetDeviceInfo(device, CL_DEVICE_VERSION, sizeof(version), version, NULL);
clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(max_compute_units), &max_compute_units, NULL);
clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(max_work_group_size), &max_work_group_size, NULL);
clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(global_mem_size), &global_mem_size, NULL);
printf("=== Mali GPU 设备信息 ===\n");
printf("设备名称: %s\n", name);
printf("厂商: %s\n", vendor);
printf("OpenCL版本: %s\n", version);
printf("计算单元数: %u\n", max_compute_units);
printf("最大工作组大小: %zu\n", max_work_group_size);
printf("全局内存大小: %.2f MB\n", (double)global_mem_size / (1024 * 1024));
// 4. 创建上下文
context = clCreateContext(NULL, 1, &device, NULL, NULL, &err);
CHECK(err, "clCreateContext");
// 5. 创建命令队列
queue = clCreateCommandQueue(context, device, 0, &err);
CHECK(err, "clCreateCommandQueue");
printf("\n上下文与命令队列创建成功。\n");
// 6. 清理资源
clReleaseCommandQueue(queue);
clReleaseContext(context);
return 0;
}
编译与运行
# 使用OpenCL头文件与库编译
gcc -o mali_init mali_init.c -lOpenCL
# 在Mali设备上运行
./mali_init
验证方法
在Mali GPU设备上运行程序,观察输出。判定标准:
- 程序正常退出,返回码为0;
- 设备名称显示为Mali GPU型号(如Mali-T860、Mali-G72等);
- 厂商为ARM或相关授权厂商;
- OpenCL版本不低于1.2;
- 计算单元数、工作组大小、全局内存均为非零合理值;
- 最后输出“上下文与命令队列创建成功”。
预期输出示例
=== Mali GPU 设备信息 ===
设备名称: Mali-T860
厂商: ARM
OpenCL版本: OpenCL 1.2
计算单元数: 16
最大工作组大小: 512
全局内存大小: 2048.00 MB
上下文与命令队列创建成功。
注意:以上为预期输出示例,实际数值取决于具体Mali GPU型号与驱动版本。若设备不支持OpenCL或驱动未安装,程序将在对应步骤报错退出。