не может создать суббуфер в OpenCL на основе C - PullRequest
0 голосов
/ 16 декабря 2018

Я не могу создать дополнительный буфер в OpenCL vai мой код c, он возвращает код ошибки, который говорит недопустимое значение, и я не могу отследить, почему он не работает.

    #include <stdio.h>
#include <CL\cl.h>
#define LOG(...) printf(__VA_ARGS__);printf("\n");

static void logError(char * type, cl_int err);
void print_buffer_info();

int main() {
    print_buffer_info();
}

void print_buffer_info() {
    //Get Platform
    cl_platform_id *plid;
    cl_uint no_of_platforms;
    clGetPlatformIDs(2, NULL, &no_of_platforms);
    plid = malloc(sizeof(cl_platform_id)*no_of_platforms);
    clGetPlatformIDs(no_of_platforms, plid, NULL);
    LOG("No of platforms: %d", no_of_platforms);

    //get device 
    cl_device_id *dids;
    cl_uint dev_count;
    clGetDeviceIDs(plid[0], CL_DEVICE_TYPE_GPU, 2, NULL, &dev_count);
    LOG("No of device: %d", dev_count);
    dids = malloc(sizeof(cl_device_id)*dev_count);
    clGetDeviceIDs(plid[0], CL_DEVICE_TYPE_GPU, dev_count, dids, NULL);

    //get context
    cl_context ctxt= clCreateContext(NULL, 1, dids, NULL, NULL, NULL);

    float host_ptr[50];
    cl_int err;
    //create main buffer
    cl_mem main_buffer= clCreateBuffer(ctxt,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
        sizeof(host_ptr),
        host_ptr, 
        &err);
    size_t size_main;
    clGetMemObjectInfo(main_buffer, CL_MEM_SIZE, 10, &size_main, &err);
    LOG("Size of main buffer: %d", size_main);
    logError("Main Buffer", err);

    //create sub-buffer
    cl_buffer_region region = {
        .origin = 10 * sizeof(float),
        .size = 10 * sizeof(float)
    };
    LOG("Origin: %d, Size: %d", region.origin, region.size);
    cl_mem sub_buffer = clCreateSubBuffer(main_buffer, 
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, 
        CL_BUFFER_CREATE_TYPE_REGION, 
        &region,
        &err);
    logError("Sub-buffer", err);
    size_t size_sub;
    clGetMemObjectInfo(sub_buffer, CL_MEM_SIZE, 10, &size_sub, NULL);
    LOG("Size of sub buffer: %d", size_sub);
}

static void logError(char * type, cl_int err) {
    if (err < 0) {
        LOG("Cannot create %s : %d", type, err);
        if (CL_INVALID_MEM_OBJECT == err) {
            LOG("CL_INVALID_MEM_OBJECT");
        }
        if (CL_INVALID_VALUE == err) {
            LOG("CL_INVALID_VALUE ");
        }
        if (CL_OUT_OF_RESOURCES == err) {
            LOG("CL_OUT_OF_RESOURCES  ");
        }

        if (CL_OUT_OF_HOST_MEMORY == err) {
            LOG("CL_OUT_OF_HOST_MEMORY  ");
        }

        exit(1);
    }
}

Эта программа дает результат:

Количество платформ: 2 Количество устройств: 1 Размер основного буфера: 200 Источник: 40, Размер: 40 Невозможно создать дополнительный буфер: -30 CL_INVALID_VALUE

Теперь я не могу понять, почему создание суббуфера, говорящего: CL_INVALID_VALUE?

1 Ответ

0 голосов
/ 16 декабря 2018

Если я объявлю свой суббуфер как таковой, эта проблема разрешится:

cl_mem sub_buffer = clCreateSubBuffer(main_buffer, 
        CL_MEM_READ_ONLY, //removed :CL_MEM_COPY_HOST_PTR
        CL_BUFFER_CREATE_TYPE_REGION, 
        &region,
        &err);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...