c++ - OpenCL NDRange 用法 - 内核仅更改输出缓冲区的一部分

标签 c++ opencl

我有一个使用 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/

相关文章:

c++ - 需要有关 c++ system() 函数的帮助

c++ - 如何为 Windows 和 Android 创建 SDL2 Visual Studio 2015 或 2017 解决方案?

opencl - CL_MEM_USE_HOST_PTR Vs CL_MEM_COPY_HOST_PTR Vs CL_MEM_ALLOC_HOST_PTR

scala - OpenCL 适合基于代理的模拟吗?

memory-leaks - 如果我不调用 clRelease* ,会导致内存泄漏吗?

c++ - OpenCL : pass two String to kernel, 什么都不返回

c++ - 为什么相同的模板类会得到相同的静态 ID?

c++ - Visual Studio 2010 中的右值引用

c++ - 用 "if"建模 "for"

c++ - 我可以根据 C++ 中的运行时条件定义类型别名吗?