1. 初始化Mali GPU计算环境

{'id' 学习卡片

任务说明

本案例目标是在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 OpenCL 初始化流程 clGetPlatformIDs 获取OpenCL平台 clGetDeviceIDs 获取Mali GPU设备 clGetDeviceInfo 查询名称/版本/内存等 设备信息输出 名称: Mali-T860 OpenCL: 1.2 计算单元: 16 全局内存: 2048 MB clCreateContext 创建计算上下文 clCreateCommandQueue 创建命令队列 ✓ 初始化完成,环境就绪

预期输出示例

=== Mali GPU 设备信息 ===
设备名称: Mali-T860
厂商: ARM
OpenCL版本: OpenCL 1.2
计算单元数: 16
最大工作组大小: 512
全局内存大小: 2048.00 MB

上下文与命令队列创建成功。

注意:以上为预期输出示例,实际数值取决于具体Mali GPU型号与驱动版本。若设备不支持OpenCL或驱动未安装,程序将在对应步骤报错退出。