【问题标题】:What is the maximum allowable size of a local float array?本地浮点数组的最大允许大小是多少?
【发布时间】:2016-09-10 12:10:13
【问题描述】:

对于 OpenCL,具体来说: 本地浮点数组的最大尺寸是多少?

我是这样设置内核的:

__kernel void mykern( unsigned int N, __global float* input, __global float* output, __local float* sdata )
{
    // ...
}

我可以将 sdata 的大小设置为(在 OpenCL 中)的最大值是多少?

我在 C++ OpenCL 中做了以下操作:

clSetKernelArg(kf_myvred,3,(lws[0])*sizeof(cl_float),NULL);
clEnqueueNDRangeKernel(mycommandq,kf_myvred,1,NULL,work,lws,0,NULL,NULL);

如果大小太大,则 clEnqueueNDRangeKernel 返回错误 CL_OUT_OF_RESOURCES。但我不确定限制是多少。

【问题讨论】:

  • 如果我使用 global_work_size 作为尺寸,那么它会给我一个错误。但是如果我使用 local_work_size,它不会给我一个错误。
  • C++ 标准没有指定数组的最大大小。实际的最大大小取决于您的 C++ 实现,并且显然会根据给定时间的可用内存量而有所不同。
  • @SamVarshavchik 是否指定了所有实现都需要支持的大小?
  • 在许多实现中,限制实际上是堆栈帧的大小。所以这是对所有局部变量的组合大小的限制,而不是任何单个数组。
  • 没有。 C++ 标准没有规定。

标签: c++ opencl gpgpu


【解决方案1】:

使用clGetDeviceInfoCL_DEVICE_LOCAL_MEM_SIZE 参数来查询您的OpenCL 设备的本地内存大小。通常在 32 到 64 KB 之间。

【讨论】:

  • 感谢您的及时回复。我运行了这段代码: void print_device_local_mem_size(cl_device_id *mydevice) { size_t size; cl_ulong local_mem_size; clGetDeviceInfo(*mydevice, CL_DEVICE_LOCAL_MEM_SIZE, 0, NULL, &size); clGetDeviceInfo(*mydevice, CL_DEVICE_LOCAL_MEM_SIZE, size, &local_mem_size, NULL); printf("size: %lu ,, bytes: %lu\n", size, local_mem_size); } ;;;;并得到了这个结果: size: 8 ,, bytes: 49152 ;;;;这个结果什么意思? ;;;;
  • 表示每个工作组最多可以分配49152字节的本地内存。
  • 所以我每个工作组只有 ~49KB 的本地内存?这对我来说听起来很低。听起来对吗?
  • 那是对的。我有一些只提供 16KiB 的 GPU,所以 48KiB 已经相当慷慨了。不要忘记,如果您使用所有这些,则无法在该执行单元上(通过 SMT)安排额外的工作组,因此性能会受到影响。因此,非常节俭地使用本地内存通常会有助于提高吞吐量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2013-04-22
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多