Я не могу создать дополнительный буфер в 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,
®ion,
&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?