【问题标题】:OpenCL variables or array in kernel cost memory?内核成本内存中的 OpenCL 变量或数组?
【发布时间】:2016-05-14 01:44:04
【问题描述】:

我正在尝试运行以下有关 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)

【问题讨论】:

  • 堆栈空间呢?

标签: c++ opencl


【解决方案1】:

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

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

另一方面,如果您打算为每个工作项(设备线程)分配 1000 个整数,那么您的计算是正确的(是的,它们会占用本地池中的内存),但它可能无法正常工作。 OpenCL 工作项只能访问本地内存(请参阅here,了解如何为您的设备检查),这是非常有限的。

【讨论】:

  • 我想我的意思是后一种,即在每个线程中分配 1000 个整数。因为数组是每个线程的私有变量,对吧?所以我认为理论上最多会有 N * 1000 * sizeof(int) 内存成本。
  • 它不会是 N * 1000 * sizeof(int),而是 M * 1000 * sizeof(int) 其中 M 是本地工作组大小,未指定,因此最多为运行时。
  • @Dithermaster 是的,您在技术上是正确的。但是,如果您查看 OpenCL 规范,则可能有多个工作组同时运行。这个数字取决于每个工作组的内存和实现。 clEnqueueNDRangeKernel 调用也有可能因CL_OUT_OF_RESOURCES 而完全失败。我总是建议人们计算整个内核运行所需的内存,而不是依赖于设备/实现的细节。
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2011-10-08
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多