2016-05-13 63 views
0

我正在尝试运行以下关于OpenCL的代码。在核函数,我会定义一个数组int arr[1000] = {0};OpenCL变量或内核成本内存中的数组?

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)

+0

堆栈空间呢? –

回答

0

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

内核函数工作从主机(CPU)传入内核数 - 所以你最好使用clCreateBuffer分配主机上的阵列和设置使用clSetKernelArg的ARG。您的内核不声明/分配设备内存,只是将其作为__global参数接收。现在,当您使用clEnqueueNDRangeKernel运行内核时,OpenCL实现将分配1000个整数,并在每个整数上运行一个线程。

如果,另一方面,你的意思分配每个工作项目(设备线程)1000个整数,你的计算是正确的(是的,它们的价格从本地池内存),但它可能不会工作。 OpenCL工作项只能访问本地内存(请参阅here了解如何针对您的设备进行检查),这是非常有限的。

+0

我认为我的意思是后者,即在每个线程中分配1000个整数。因为数组是每个线程的私有变量,对吗?所以我认为在理论上最多会有N * 1000 * sizeof(int)内存成本。 –

+0

是的,这是正确的。 – Ani

+0

这不会是N * 1000 *的sizeof(int)的,这将是M * 1000 *的sizeof(int)的其中M是本地工作组大小,这是未指定,因此它最多的运行时间。 – Dithermaster