Бинарная компиляция в OpenCL - PullRequest
       67

Бинарная компиляция в OpenCL

0 голосов
/ 04 января 2019

После этого примера с github .Я столкнулся с проблемой при попытке использовать готовый двоичный файл.

Я успешно создал свой двоичный файл, так как получаю сообщение PLATFORM [Apple] --> SUCCESS (1).

Но при попытке использовать двоичный файл функция clBuildProgram выдает код ошибки CL_BUILD_PROGRAM_FAILURE.¿Любой совет?

Я использую этот код:

    int length = int_par[1];

    cl_int err;

    // Query platforms and devices
    cl_platform_id platform;
    err = clGetPlatformIDs(1, &platform, NULL);

    cl_device_id device;
    err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, NULL);

    const cl_context_properties prop[] = {
        CL_CONTEXT_PLATFORM, (cl_context_properties)platform,
        0
    };

    // Create context
    cl_context context = clCreateContext(prop, 1, &device, NULL, NULL, &err);

    // Create program
    unsigned char* program_file = NULL;
    size_t program_size = 0;
    read_file1(&program_file, &program_size, "Kernel.clbin");

    cl_program program =
    clCreateProgramWithBinary(context, 1, &device, &program_size,
                              (const unsigned char **)&program_file,
                              NULL, &err);
   if(err!=CL_SUCCESS) Rprintf("clCreateProgramWithBinary!!!!\n%s\n", err_code(err));
err = clBuildProgram(program, 1, &device, NULL, NULL, NULL);

    free(program_file);

    if (err != CL_SUCCESS)
    {
        size_t len;
        //char buffer[2048*3000];

        Rprintf("Error: Failed to build program executable!\n%s\n", err_code(err));
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &len);
        //char *buffer = (char *) malloc(len);
        //char *buffer = (char*)calloc(len, sizeof(char));
        char *buffer =calloc(len,sizeof(char));
        //memset(buffer, 0, len);
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, len, buffer, NULL);
        SEP;

        Rprintf("Build Log:\n%s\n", buffer);
        SEP;
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_STATUS, sizeof(char), buffer, &len);
        Rprintf("Build Status:\n%s\n", buffer);
        SEP;
        clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_OPTIONS, sizeof(char), buffer, &len);
        Rprintf("Build Options:\n%s\n", buffer);
        SEP;
        //return EXIT_FAILURE;
    }

Кроме того, стоит отметить, что этот код хорошо работал в ОС Sierra, но после обновления до Мохаве, он сделалбольше нет.

1 Ответ

0 голосов
/ 10 марта 2019

Мне пришлось обратиться за помощью на другую платформу и, наконец, получил ответ.Позвольте мне поделиться этим, если кому-то когда-нибудь понадобится:

"Основное исправление было в программе cl-compile, которая изменила то, что сохраняется в двоичном файле. Она использовалась для сохранения программы, созданной методом clBuildProgram, и теперьон сохраняет программу, созданную методом clCompileProgram.

Итог, если вы хотите сохранить скомпилированное ядро, сохраните его после вызова метода clCompileProgram. В #Mojave вы не можете собрать программу из двоичного файла, если этот двоичный файлранее был построен clBuildProgram. "

...