我最近开始学习OpenCL,并对OpenCL中缓存和内核之间的交互有疑问。我正在编写一个程序来测量访问主内存的延迟。(绕过缓存)因此,我想知道在内核执行完成后是否自动清除缓存,或者在重复执行相同的内核时它是否会被保留并被使用? 谢谢!
答案 0 :(得分:1)
对于AMD Radeon GCN,L1和L2缓存在所有内核和所有不同内核之间都是持久的。内核可以使用来自任何其他内核的缓存数据。此外,计算单元内的本地内存不会在内核运行之间清除/归零(更确切地说,在工作组运行之间)。这意味着您必须初始化局部变量。这同样适用于nVidia / CUDA设备和通用SIMD CPU。
话虽如此,OpenCL不知道或定义不同级别的缓存,缓存是特定于供应商的。处理或管理缓存的任何功能都是特定于供应商的扩展。
要测试延迟,请在内核中使用伪随机数生成器,并读取随机内存地址。使用2个内核,第1个内核污染所有缓存,第2个内核然后进行实际延迟测量。
答案 1 :(得分:0)
在OpenCL内存层次结构中没有“缓存”(在CPU意义上)。在OpenCL中,您可以通过一些指令控制不同类型的存储器。在这里你可以看看我的意思:
最快的记忆是私人记忆和本地记忆。您可以在此内存空间和控件中声明变量,以您喜欢的方式移动它们。您应该小心,因为在本地内存中,您可以在“块”之间共享数据,并且Privite内的数据仅由线程可见。 Here你可以找到很多其他信息。 因此,如果你反复运行一个内核,你可以将你的变量存储在你喜欢的内存中,你会注意到如果变量属于私有库存,那么与其他解决方案相比,你将非常快。