内核成本内存中的OpenCL变量或数组?

时间:2016-05-13 16:11:18

标签: c++ opencl

我正在尝试运行以下有关OpenCL的代码。在内核函数中,我将定义一个数组int arr[1000] = {0};

kernel void test()
{
    int arr[1000] = {0};
}

然后我将创建N个线程来运行内核。

cl::CommandQueue cmdQueue;
cmdQueue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(N), cl::NullRange); // kernel here is the one running test()

我的问题是,既然我们知道OpenCL将并行运行线程,这是否意味着,峰值内存将为N * 1000 * sizeof(int)

1 个答案:

答案 0 :(得分:0)

这不是通往OpenCL的方式(是的,这就是我的意思:)。

内核函数在从主机(CPU)传入的内核操作数上运行 - 因此您使用clCreateBuffer在主机上分配数组并使用{{3}设置arg }}。您的内核不会声明/分配设备内存,而只是将其作为__global参数接收。现在,当您使用clSetKernelArg运行内核时,OpenCL实现将分配1000个int并在每个int上运行一个线程。

另一方面,如果你打算为每个工作项(设备线程)分配1000个int,你的计算是正确的(是的,它们从本地池中花费了内存),但它可能不起作用。 OpenCL工作项只能访问本地内存(请参阅clEnqueueNDRangeKernel了解如何为您的设备检查此内容),这是非常有限的。