作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 3 维 NDRange 调用的内核,但它只更改了输出缓冲区的一部分。
内核:
__kernel void Kernel2(
__global const float* K2BufIn,
__global float* K2BufOut)
{
int id0 = get_global_id(0);
int id1 = get_global_id(1);
int id2 = get_global_id(2);
int gs0=get_global_size(0);
int gs1=get_global_size(1);
int gs2=get_global_size(2);
int globalThreadNum = id0 + id1 * gs0 + id2 * gs0 * gs1;
K2BufOut[globalThreadNum] = K2BufIn[globalThreadNum] * K2BufIn[globalThreadNum];
}
调用如下:
float pK2BufInData[24] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0};
float pK2BufOutData[24] = {};
int sizeK2BufIn = 24;
int sizeK2BufOut = 24;
K2BufIn = cl::Buffer(context_, CL_MEM_READ_WRITE, sizeK2BufIn);
K2BufOut = cl::Buffer(context_, CL_MEM_READ_WRITE, sizeK2BufOut);
commandQ_.enqueueWriteBuffer(K2BufIn, CL_TRUE, 0, sizeK2BufIn, pK2BufInData);
kernel_Kernel2_.setArg(0, K2BufIn);
kernel_Kernel2_.setArg(1, K2BufOut);
commandQ_.enqueueNDRangeKernel(kernel_Kernel2_, cl::NULLRange, cl::NDRange(4,3,2));
commandQ_.enqueueReadBuffer(K2BufOut, CL_TRUE, 0, sizeK2BufOut, pK2BufOutData);
我期望的是 pK2BufOutData 然后包含输入数字的平方。然而,调试给了我:
(gdb) p *pK2BufOutData@24
$17 = {0 <repeats 16 times>, 289, 324, 361, 400, 441, 484, 529, 576}
这意味着该代码仅适用于最后 8 个条目。这里有什么问题?
最佳答案
我在这个线程中找到了答案:Problem with get_global_id(1);
结果是行
commandQ_.enqueueNDRangeKernel(kernel_Kernel2_, cl::NULLRange, cl::NDRange(4,3,2));
必须改为
commandQ_.enqueueNDRangeKernel(kernel_Kernel2_, cl::NDRange(), cl::NDRange(4,3,2));
关于c++ - OpenCL NDRange 用法 - 内核仅更改输出缓冲区的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560591/
我正在尝试使用 OpenCL 复制图像: std::string kernelCode = "void kernel copy(global const int* image,
我不明白 clEnqueueNDRangeKernel() 中的 work_dim 是什么? 那么,work_dim=1 和 work_dim=2 有什么区别呢? 为什么工作项被分组到工作组中? 工作
我和我的同学第一次面对 OpenCL。正如预期的那样,我们遇到了一些问题。下面我总结了我们遇到的问题和我们找到的答案。但是,我们不确定我们是否做对了,所以如果你们能同时看看我们的答案和下面的问题,那就
我有一个使用 3 维 NDRange 调用的内核,但它只更改了输出缓冲区的一部分。 内核: __kernel void Kernel2( __global const float* K2BufIn,
我是一名优秀的程序员,十分优秀!