使用本地(共享)内存存储函数参数的nVidia OpenCL实施的解决方法

时间:2019-01-31 02:28:54

标签: opencl nvidia

根据nVidia的“ OpenCL最佳实践指南”,

  

共享内存保存启动时传递给内核的参数或参数。

我有一个带有较长参数列表的内核,该列表需要所有可用的本地内存(48kb)。在Linux,CUDA10和Tesla P100上,我遇到了内核参数侵占本地内存的问题(但由于某些原因,无论参数数目如何,仅针对3个指针或更多指针的参数列表,以及4个字节);以及在装有CUDA10平台和nVidia驱动程序的MacOS上根本不会发生这种情况。

无论如何,指南提出的解决方案是

  

在带有长参数列表的内核中,将一些参数放入常量内存(并在其中引用)而不是消耗共享内存可能很有价值。

问题是,我所有的参数都是指针,而且似乎不可能通过标准方式获得OpenCL中缓冲区的GPU地址。我能想到的唯一解决方案是运行一个小的内核,将所有必需的指针保存到某个结构,然后将其用作主内核的唯一参数(可能将其标记为__constant)。不过,这似乎是一种黑客行为,我怀疑OpenCL驱动程序随时可能会更改缓冲区的物理地址。

是否有更好的解决方法?也许可以关闭以某种方式将参数存储在本地内存中的方法?

0 个答案:

没有答案