我在设备上分配了一个缓冲区:
cl_mem buff;
我想将此缓冲区加上一个偏移量传递给我的内核
即。
buff + offset;
我发现这是不允许的。如果我将buff传递给我的内核然后 计算内核中的偏移缓冲区,然后这很好。但它为每个内核运行添加了一个不必要的计算。
所以,我得到的设备内存空间与主机不同,所以我不能做简单的指针算法。但是,有没有办法将地址带到设备内存缓冲区, 计算偏移量,并将此偏移缓冲区传递给内核?
我认为clCreateSubBuffer可以实现这一点,但偏移量需要与设备的CL_DEVICE_MEM_BASE_ADDR_ALIGN保持一致,而且我的内核并不总是这样。
答案 0 :(得分:1)
如果可以静态计算偏移量,则在构建内核程序时导出宏; 假设您使用的是C ++
std::string macro;
std::stringstream ss;
// e. g. let it be 2^10
std::size_t offset = 1024;
ss << offset;
macro = "-D offset=";
macro += ss.str();
...
// When building Programm
clBuildProgram(..., macro.c_str(), ...);
//Inside your Kernel macro "offset" is defined
void __kenel my(
__global const uchar* data)
{
__global const uchar* data_with_shift = data + offset;
return;
}
虽然内核中的计算非常便宜,但 Marco13 给了您很好的建议。