如何将带偏移的设备内存缓冲区传递给我的内核

时间:2014-04-12 21:47:05

标签: opencl

我在设备上分配了一个缓冲区:

cl_mem buff;

我想将此缓冲区加上一个偏移量传递给我的内核

即。
     buff + offset;

我发现这是不允许的。如果我将buff传递给我的内核然后 计算内核中的偏移缓冲区,然后这很好。但它为每个内核运行添加了一个不必要的计算。

所以,我得到的设备内存空间与主机不同,所以我不能做简单的指针算法。但是,有没有办法将地址带到设备内存缓冲区, 计算偏移量,并将此偏移缓冲区传递给内核?

我认为clCreateSubBuffer可以实现这一点,但偏移量需要与设备的CL_DEVICE_MEM_BASE_ADDR_ALIGN保持一致,而且我的内核并不总是这样。

Using clCreateSubBuffer

1 个答案:

答案 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 给了您很好的建议。