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 }
问题原因及修复方案
缺失程序编译步骤:仅调用
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; }内核名称大小写不匹配:源代码中定义的内核是
SAXPY(全大写),但clCreateKernel中使用的是saxpy(全小写),这会导致OpenCL找不到对应的内核函数。需要将两者名称统一,要么都用大写,要么都用小写。
内容的提问来源于stack exchange,提问作者Delfin
相关产品推荐
相关产品推荐

