我正在为GPU的DRAM(全局)内存编写一系列测试。专门针对大溪地和夏威夷模型系列的AMD GCN架构。拱门有一个回写L2缓存。
我想要的是确保在另一个线程读取之前,全局内存中的存储确实被写入全局内存。
规范中的barrier和mem_fence文档说明:
CLK_GLOBAL_MEM_FENCE - 屏障函数将对内存栅栏进行排队,以确保将内存操作正确排序到全局内存。当工作项(例如,写入缓冲区或图像对象,然后想要读取更新的数据)时,这非常有用。
但是,这只会强制执行正确的排序。我的问题是这是否会触发对L2缓存数据的全局内存的写入?
答案 0 :(得分:3)
OpenCL 1.2接下来无法控制这一点。如果你仔细阅读只会影响工作组,那么围栏的定义非常糟糕。因此,在内核完成之前,很可能没有任何东西会强制缓存刷新。
OpenCL 2.0为您提供完整的订购控制。订购就是你得到的,而不是显式的缓存操作。
如果您对all_svm_devices范围执行发布写入,那么当您在另一台设备上的工作项中看到它时,您就知道它之前的每个写入也必须是可见的。这可能意味着如果缓存未使用基于标准所有权的一致性协议,则刷新缓存。
如果您只发布到设备范围并且L2在整个设备上共享,则无需刷新它以保证订购。
内存模型完全是根据排序来定义的,而不是根据高速缓存来定义,但是使用范围可以在非常宽松的高速缓存层次结构上实现高效的实现。