如何将像素坐标表示为1D数组



我正在关注OpenCL的异构计算,它让我悬着不放。

它们将一个图像作为一个浮点数组传递给enqueueWriteBuffer。我认为在这种情况下,图像没有颜色值。它只是{col,row,col,rowcol,row},例如{0,0,0,1,0,2,1,0,1,1,1,2…}。

但当他们进行入队时,他们期望的大小是HW,如果你要像我刚才做的那样做一个数组,数组大小将是HW*2。

// SETUP BUFFERS
Buffer d_ip = Buffer(context, CL_MEM_READ_ONLY, W*H*sizeof(float));
Buffer d_op = Buffer(context, CL_MEM_WRITE_ONLY, W*H*sizeof(float));
queue.enqueueWriteBuffer(d_ip, CL_TRUE, 0, W*H*sizeof(float), img); //img, what is img? the book just says it is my image.
// SETUP RANGES
NDRange globalws(W, H);
NDRange localws(16, 16);
// QUEUE AND READ
queue.enqueueNDRangeKernel(rotn_kernel, NullRange, globalws, localws);
queue.enqueueReadBuffer(d_op, CL_TRUE, 0, W*H*sizeof(float), img);
// X AND Y INSIDE THE KERNEL
const int x = get_global_id(0);
const int y = get_global_id(1);

如果所有新的像素坐标都是在内核中计算的,你不能只传递一个适当大小的空浮点数组吗(显然是WH,尽管我看不出它不是WH*2)。但后来我试着(在500x300的图像上)对它进行了艰苦的编码,结果它破坏了我的堆栈。

它的大小不是W*H*2,因为它们可能没有像您想象的那样存储数据。通常,存储这种性质的数据,使得数据的第一行存储在第一W条目中,第二行存储在第二W条目中,等等。;这导致大小为CCD_ 4的阵列。因此,要获得关于X行、Y列中某些内容的信息,必须获得索引(W * X) + Y处的元素

在编写OpenCL代码时,我总是将每个内核视为读取一组3D数据,无论数据是1D、2D还是3D:

 __kernel void TestKernel(__global float *Data){
      k = get_global_id(0); //also z
      j = get_global_id(1); //also y
      i = get_global_id(2); //also x
      //Convert 3D to 1D
      int linear_coord = i + get_global_size(0)*j + get_global_size(0)*get_global_size(1)*k;
      //do stuff
 }

执行clEnqueueNDKernelRange(…)时,只需将维度设置为:

 int X = 500;
 int Y = 300;
 int Z = 1;
 size_t GlobalDim = {Z, Y, X};

这让我的所有内核都能在各个维度上轻松工作。

你的代码不调用任何clSetKernelArg,你添加了这些吗?OpenCL函数是否有任何错误?您可能需要退一步使用OpenCLC代码,而不是C++类。

最新更新