在openCL中从主机向设备发送2D数据

时间:2014-05-12 15:49:48

标签: opencl

我可以向设备发送二维数据吗?如果是,那我该怎么做?意味着如何声明缓冲存储器?还有我如何在内核函数/设备中获取/使用这些值?

2 个答案:

答案 0 :(得分:2)

  

PLZ尽快回复

不确定

cl_mem对象不能包含其他cl_mem个对象。因此,在OpenCL中不可能使用这样的“2D”数据。 (在CUDA中,这是可能的,因为“缓冲区”只有指向设备内存的指针)。

通常,您可以将数据转换为一个大型cl_mem对象,并在内核中正确访问它:

__kernel void compute(__global float *data2D, int sizeX, int sizeY)
{
    int ix = get_global_id(0);        
    int iy = get_global_id(1);
    int index = ix + iy * sizeX;
    float element = data2D[index];
    ....
}

答案 1 :(得分:1)

假设您在C ++端有一个2D缓冲区。

 a Buffer of type (float *)[2048];

然后你需要通过

获取该缓冲区的地址
 float *address= &a[0][0];

然后你为cl_mem对象使用该地址。

您也可以使用堆栈!

 float *a=new float[2048][2048];
 ....
 ....
 float *address=&a[0][0];

您对此区域的opencl-side访问必须与C ++方面完全重叠。除了C ++之外,你需要知道你的矩阵是行主要的还是colum-major,或者在使用它们之前它是数组数组还是对象数组(比如java)。如果矩阵在内存上不连续,则可能会失败。

有一些函数可以从/向opencl缓冲区写入或读取缓冲区。它们的结构和包装器可以从版本更改为版本(甚至是使用的语言)