gpt4 book ai didi

c++ - openCL - 创建子缓冲区返回错误代码 13

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:48 27 4
gpt4 key购买 nike

大家好,我是 OpenCL 新手,正在使用 C++ 包装器。尝试同时在两个设备上运行相同的内核。创建缓冲区并尝试使用子缓冲区将其分块并将这些 block 传递给内核并分派(dispatch)它们两次 - 一次到命令队列 1,然后到命令队列 2,主缓冲区的不同 block 。

运行时会抛出错误-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);

最佳答案

来自documentation :

CL_MISALIGNED_SUB_BUFFER_OFFSET is returned in errcode_ret if there are no devices in context associated with buffer for which the origin value is aligned to the CL_DEVICE_MEM_BASE_ADDR_ALIGN value.

看起来您可能需要将分割区域的偏移量和大小对齐到所有设备的 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++ 标准库功能,所以如果您的工具链中没有它,您需要提供 your own lcm function 。)

关于c++ - openCL - 创建子缓冲区返回错误代码 13,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51711298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com