openCL-创建子缓冲区返回错误代码13
openCL - Creating sub-buffers returns errorcode 13
嗨,我是OpenCL的新手,正在使用C++包装器。尝试在两台设备上同时运行同一内核。创建了缓冲区,尝试使用子缓冲区对其进行分块,并将这些chuck传递给内核,然后将它们调度两次——一次发送到命令队列1,然后发送到具有不同主缓冲区块的命令队列2。
运行时会抛出一个错误-13。除了这个有问题的子缓冲区之外,所有其他子缓冲区都已创建。
任何指导都将不胜感激。
使用OpenCL 1.1
//Creating main buffer
cl::Buffer zeropad_buf(openclObjects.context,CL_MEM_READ_ONLY| CL_MEM_COPY_HOST_PTR,(size+2)*(size+2)*cshape[level][1]*sizeof(float),zeropad);
cl::Buffer output_buf(openclObjects.context,CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR ,cshape[level][0]*size*size*sizeof(float),output_f);
//Creating sub_buffers for zeropad_buf
size_t zeropad_buf_size = (size+2)*(size+2)*cshape[level][1]*sizeof(float);
size_t output_buf_size = cshape[level][0]*size*size*sizeof(float);
cl_buffer_region zero_rgn_4core = {0, zeropad_buf_size/2};
**cl_buffer_region zero_rgn_2core = {zeropad_buf_size/2, zeropad_buf_size/2};** //Throws error -13
cl_buffer_region output_rgn_4core = {0, output_buf_size/2};
cl_buffer_region output_rgn_2core = {output_buf_size/2, output_buf_size/2};
cl::Buffer zeropad_buf_4Core = zeropad_buf.createSubBuffer(CL_MEM_READ_ONLY,CL_BUFFER_CREATE_TYPE_REGION, &zero_rgn_4core);
**cl::Buffer zeropad_buf_2Core = zeropad_buf.createSubBuffer(CL_MEM_READ_ONLY,CL_BUFFER_CREATE_TYPE_REGION, &zero_rgn_2core);**
std::cout<<"zero_pad sub-buffer created"<<std::endl;
cl::Buffer output_buf_4Core = output_buf.createSubBuffer(CL_MEM_READ_WRITE,CL_BUFFER_CREATE_TYPE_REGION, &output_rgn_4core);
cl::Buffer output_buf_2Core = output_buf.createSubBuffer(CL_MEM_READ_WRITE,CL_BUFFER_CREATE_TYPE_REGION, &output_rgn_2core);
来自文档:
CL_MISALIGNED_SUB_BUFFER_OFFSET
在errcode_ret
中返回,如果上下文中没有与原始值与CL_DEVICE_MEM_BASE_ADDR_ALIGN
值对齐的缓冲区相关联的设备。
看起来您可能需要将分割区域的偏移量和大小调整为所有设备的CL_DEVICE_MEM_BASE_ADDR_ALIGN
属性的最小公倍数(LCM(的整数倍。
我的意思是:
假设您使用的设备在可变中
std::vector<cl::Device> devices;
查询每个设备的CL_DEVICE_MEM_BASE_ADDR_ALIGN
属性:
cl_uint total_alignment_requirement = 1;
for (cl::Device& dev : devices)
{
cl_uint device_mem_base_align = 0;
if (CL_SUCCESS == dev.getInfo(CL_DEVICE_MEM_BASE_ADDR_ALIGN, &device_mem_base_align))
total_alignment_requirement = std::lcm(total_alignment_requirement, device_mem_base_align);
}
然后,在分配zeropad
时,请确保内存与total_alignment_requirement
对齐,例如,如果您当前使用malloc()
分配内存,请改用posix_memalign()
。(更好的是,不要使用CL_MEM_USE_HOST_PTR
创建缓冲区,如果可以的话,让OpenCL分配内存。(
最后,您的区域也需要对齐:
size_t zeropad_split_pos = zeropad_buf_size / 2;
zeropad_split_pos -= zeropad_split_pos % total_alignment_requirement;
cl_buffer_region zero_rgn_4core = {0, zeropad_split_pos};
cl_buffer_region zero_rgn_2core = {zeropad_split_pos, zeropad_buf_size - zeropad_split_pos};
这确保了第一个区域在total_alignment_requirement
的倍数的地址上开始和结束,第二个区域也在对齐地址上开始。
(我还没有测试过这个代码,但它应该接近正确。请注意,std::lcm
是一个非常新的C++标准库功能,所以如果你的工具链中没有,你需要提供自己的lcm功能。(
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- openCL-创建子缓冲区返回错误代码13
- 为什么我的代码返回了错误的平方值?C++
- 如何从构造函数返回错误代码?
- 如何使用 RAII 包装返回错误代码的 C 分配
- ChangeWindowMessageFilterEx() 返回错误代码 5
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 为什么此代码返回分段错误错误?
- mmdevice API中的cocreateinstance返回错误代码0x800401f0
- Ubuntu E:子进程 /usr/bin/dpkg 返回错误代码 (1)
- 如何避免使用多个if-else来检查返回值是否为错误代码?
- SQLite 错误代码:sqlite_step() 返回 5 (SQLITE_BUSY)
- JNI 代码返回字符串,但得到错误 java.lang.UnsatisfiedLinkError: com.packag
- 使用Outlook 2016:MAPISendMail在Windows应用程序中失败,并返回"MAPI_E_FAILURE"作为错误代码
- 获取 Poco 返回的错误代码的文本
- GetProcAddress 在 c++ 中返回错误代码 127
- 尝试从资源加载位图返回NULL,错误代码为1813
- 开发人员在Dev C 中编译代码时,我会收到此错误:[错误] ID返回1退出状态
- C++错误处理-使用std::pair或std::tuple返回错误代码和函数返回的缺点