如果满足以下条件,则 CUDA 中对全局内存的一般读取和写入是原子的:
- 它是一个4字节指令? (我认为是的)
- 它是8字节还是16字节指令? (我认为是的)
至少在开普勒和费米通用 4 字节读取和写入全局存储器原子上 Warp 级别或 8/16 字节指令原子在半/四分之一 Warp 级别,如果:
- 所有 warp 线程都访问同一个 32 字节 L2 事务块? (我认为是的)
- Warp 线程访问不同的 32 字节 L2 事务块,但所有 Warp 线程访问相同的 128 字节 L2 缓存行? (我假设没有)
- 所有 warp 线程都访问不同的 L2 缓存线? (我假设没有)
如果关于扭曲级别原子性的任何假设是正确的,那么是否有任何方法可以利用这些知识而不冒与未来计算能力的兼容性的风险?
读取和写入通常针对缓存进行。当事务发送到全局内存时,CUDA 编程或内存模型中无法保证原子性,除非atomic
使用说明。
例如,假设线程块中的线程更新了 Kepler 上 L2 中的 4 字节数量。现在,另一个线程,在另一个扭曲,线程块中,或内核在该缓存行被逐出到全局内存之前,可以在 L2 中仅更新这 4 个字节之一。当缓存行被逐出到全局内存时,它可能不代表原始线程甚至第二个线程写入的内容(例如,如果出现第三次写入......)。
请记住,L2 是回写式缓存,无法禁用,并且不会被全局读取和写入绕过,除非出现以下情况:atomic
指示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)