我可以向设备发送二维数据吗?如果是,那我该怎么做?意味着如何声明缓冲存储器?还有我如何在内核函数/设备中获取/使用这些值?
答案 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缓冲区写入或读取缓冲区。它们的结构和包装器可以从版本更改为版本(甚至是使用的语言)