Opencl 如何将带有偏移量的设备内存缓冲区传递到内核

Opencl 如何将带有偏移量的设备内存缓冲区传递到内核,opencl,Opencl,我已在设备上分配了一个缓冲区: cl_mem buff; 我想把这个缓冲区加上一个偏移量传递给我的内核 i、 e. buff+偏移量 我发现这是不允许的。如果我将buff传递到内核中 计算内核内的偏移缓冲区,这样就可以了。但它在每次内核运行时都会添加一个不必要的计算 所以,我发现设备内存空间与主机不同,所以我不能做简单的指针算法。但是,有没有一种方法可以将地址带到设备内存缓冲区, 计算偏移量,并将该偏移量缓冲区传递到内核 我认为使用clCreateSubBuffer可以实现这一点,但是偏移量需

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

cl_mem buff;
我想把这个缓冲区加上一个偏移量传递给我的内核

i、 e.
buff+偏移量

我发现这是不允许的。如果我将buff传递到内核中 计算内核内的偏移缓冲区,这样就可以了。但它在每次内核运行时都会添加一个不必要的计算

所以,我发现设备内存空间与主机不同,所以我不能做简单的指针算法。但是,有没有一种方法可以将地址带到设备内存缓冲区, 计算偏移量,并将该偏移量缓冲区传递到内核

我认为使用clCreateSubBuffer可以实现这一点,但是偏移量需要与设备的CL_device_MEM_BASE_ADDR_ALIGN对齐,这对于我的内核来说并不总是可能的


如果可以静态计算偏移量,则在构建内核程序时导出宏; 假设您使用的是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;
} 
std::string宏;
std::stringstream-ss;
//e。G让它是2^10
标准::大小\u t偏移=1024;

ss你认为像在
float*here=buff+12对性能有显著影响吗?谢谢,Marco。我不知道——也许正如你所暗示的,它不知道。我只是想减少不必要的计算。由于计算,这里几乎不可能看到任何差异。您更愿意看到差异,因为内存访问可能不再正确对齐(也就是说,出于性能原因,它们应该与
CL\u DEVICE\u MEM\u BASE\u ADDR\u ALIGN
对齐)未对齐的访问惩罚取决于硬件,因此无法确定未对齐会在IO操作中造成任何延迟。