You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCL简单内核编译时出现CL_OUT_OF_HOST_MEMORY错误求助

OpenCL内核创建时抛出CL_OUT_OF_HOST_MEMORY错误排查

我正在基于示例实现OpenCL内核,输入输出缓冲区均为1024个32位浮点型元素。执行代码时,clCreateKernel步骤抛出CL_OUT_OF_HOST_MEMORY错误,以下是我的main.c代码:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define CL_TARGET_OPENCL_VERSION 210
#include "CL/cl.h"

char* program_src = "__kernel void SAXPY (__global float* x, __global float* y, float a)\n"
"{\n"
"const int i = get_global_id (0);\n"
"y [i] += a * x [i];\n"
"}\n";

int main() {
    cl_platform_id platform_ids[16];
    cl_uint platform_count;

    if (clGetPlatformIDs(16, &platform_ids, &platform_count) != CL_SUCCESS) {
        return EXIT_FAILURE;
    }
    printf("%i cl platform(s) found\n", platform_count);

    if (platform_count == 0) {
        return EXIT_FAILURE;
    }

    printf("choosing platform 0...\n");

    cl_device_id device_ids[16];
    cl_int device_count;
    if (clGetDeviceIDs(platform_ids[0], CL_DEVICE_TYPE_ALL, 16, &device_ids, &device_count) != CL_SUCCESS) {
        return EXIT_FAILURE;
    }
    printf("%i cl device(s) found on platform 0\n", device_count);

    if (device_count == 0) {
        return EXIT_FAILURE;
    }

    cl_device_id device = device_ids[0];

    printf("** running test **\n");

    cl_int cl_fehler;
    cl_context ctx = clCreateContext(NULL, 1, &device, NULL, NULL, &cl_fehler);
    if (ctx == NULL) {
        printf("Fehler: %i\n", cl_fehler);
        return EXIT_FAILURE;
    }

    printf("Am clCommandQueue\n");
    cl_fehler = CL_SUCCESS;
    cl_command_queue queue = clCreateCommandQueue(ctx, device, 0, &cl_fehler);
    if (cl_fehler != CL_SUCCESS) {
        printf("Fehler: %i\n", cl_fehler);
        return EXIT_FAILURE;
    }

    // Replace 1 mit Zahlen von Gärate IDs
    printf("Am clCreateProgram\n");
    cl_fehler = CL_SUCCESS;
    cl_program program = clCreateProgramWithSource(ctx, 1, &program_src, NULL, &cl_fehler);
    if (cl_fehler != CL_SUCCESS) {
        printf("Fehler: %i\n", cl_fehler);
        return EXIT_FAILURE;
    }

    printf("Am clCreateKernel\n");
    cl_fehler = CL_SUCCESS;
    cl_kernel kernel = clCreateKernel(program, "saxpy", &cl_fehler);
    if (cl_fehler != CL_SUCCESS) {
        printf("Fehler: %i\n", cl_fehler);
        return EXIT_FAILURE;
    }
    // No point in share the rest of the code because the problem is being hapenning here
}

问题原因及修复方案

  1. 缺失程序编译步骤:仅调用clCreateProgramWithSource创建程序对象是不够的,必须先编译程序才能创建内核。部分OpenCL实现会返回不准确的错误码(比如这里的CL_OUT_OF_HOST_MEMORY)来掩盖编译缺失的问题。
    需要在clCreateProgramWithSource之后、clCreateKernel之前添加编译代码:

    printf("Am clBuildProgram\n");
    cl_fehler = clBuildProgram(program, 1, &device, NULL, NULL, NULL);
    if (cl_fehler != CL_SUCCESS) {
        // 打印编译错误日志,方便排查具体问题
        size_t log_size;
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
        char* log = malloc(log_size);
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, log_size, log, NULL);
        printf("编译错误日志:\n%s\n", log);
        free(log);
        return EXIT_FAILURE;
    }
    
  2. 内核名称大小写不匹配:源代码中定义的内核是SAXPY(全大写),但clCreateKernel中使用的是saxpy(全小写),这会导致OpenCL找不到对应的内核函数。需要将两者名称统一,要么都用大写,要么都用小写。

内容的提问来源于stack exchange,提问作者Delfin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:40:11