【发布时间】:2018-12-17 03:19:53
【问题描述】:
我无法在 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?
【问题讨论】: