Caching 当重复启动同一内核时,缓存会产生什么影响

Caching 当重复启动同一内核时,缓存会产生什么影响,caching,opencl,Caching,Opencl,我最近开始学习OpenCL,对OpenCL中缓存和内核之间的交互有一个疑问。我正在编写一个程序来测量访问主内存的延迟。(绕过缓存)因此,我想知道在内核执行完成后,缓存内存是自动清除的,还是在重复执行同一内核时保留并使用? 谢谢 在OpenCL内存层次结构中没有“缓存”(在CPU的意义上)。在OpenCL中有不同类型的内存,您可以通过一些指令来控制它们。在这里,你可以看看我的意思: 最快的内存是私有内存和本地内存。您可以在此内存空间中声明变量并进行控制,以您喜欢的方式移动它们。您应该小心,因为在

我最近开始学习OpenCL,对OpenCL中缓存和内核之间的交互有一个疑问。我正在编写一个程序来测量访问主内存的延迟。(绕过缓存)因此,我想知道在内核执行完成后,缓存内存是自动清除的,还是在重复执行同一内核时保留并使用?
谢谢

在OpenCL内存层次结构中没有“缓存”(在CPU的意义上)。在OpenCL中有不同类型的内存,您可以通过一些指令来控制它们。在这里,你可以看看我的意思:

最快的内存是私有内存和本地内存。您可以在此内存空间中声明变量并进行控制,以您喜欢的方式移动它们。您应该小心,因为在本地内存中,您可以在“块”之间共享数据,而Privite中的数据只有线程才能看到。你可以找到很多其他的信息。
因此,如果您重复运行内核,您可以将变量存储在您喜欢的内存中,并且您会注意到,如果变量位于专用内存中,则与其他解决方案相比,您的速度会非常快。

对于AMD Radeon GCNs,一级和二级缓存在所有内核和所有不同内核之间都是持久的。内核可以使用来自任何其他内核的缓存数据。此外,在内核运行之间(更准确地说,在工作组运行之间),计算单元内的本地内存不会被清除/归零。这意味着您必须初始化局部变量。这同样适用于nVidia/CUDA设备和通用SIMD CPU

也就是说,OpenCL不知道或定义不同级别的缓存,缓存是特定于供应商的。任何处理或管理缓存的功能都是特定于供应商的扩展


要测试延迟,请在内核中使用伪随机数生成器,并读取随机内存地址。使用两个内核,第一个会污染所有缓存,第二个会测量实际延迟。

这取决于实现;OpenCL规范中肯定没有指定它。我无法想象在内核调用之间清除内存缓存有什么价值,所以我假设不是。