我正在尝试运行以下有关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)
?
答案 0 :(得分:0)
这不是通往OpenCL的方式(是的,这就是我的意思:)。
内核函数在从主机(CPU)传入的内核操作数上运行 - 因此您使用clCreateBuffer在主机上分配数组并使用{{3}设置arg }}。您的内核不会声明/分配设备内存,而只是将其作为__global
参数接收。现在,当您使用clSetKernelArg运行内核时,OpenCL实现将分配1000个int并在每个int上运行一个线程。
另一方面,如果你打算为每个工作项(设备线程)分配1000个int,你的计算是正确的(是的,它们从本地池中花费了内存),但它可能不起作用。 OpenCL工作项只能访问本地内存(请参阅clEnqueueNDRangeKernel了解如何为您的设备检查此内容),这是非常有限的。