我正在关注使用 OpenCL 的异构计算,这让我悬而未决。
它们将图像作为浮点数组传递给 enqueueWriteBuffer。我认为在这种情况下,图像没有颜色值。它只是 {col,row,col,row,col,row} 例如 {0,0,0,1,0,2,1,0,1,1,1,2...}。
但是当他们执行 enqueueReadBuffer 时,他们期望的大小是 H W,如果你要像我刚刚做的那样做一个数组,那么数组大小将是 H W * 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);
如果所有新的像素坐标都是在内核中计算的,你不能只传递一个适当大小的空浮点数组(显然是 W H,尽管我不明白它不是 W H * 2)。但后来我尝试对它进行硬编码(在 500x300 图像上),它炸毁了我的堆栈。