对于哪些大小是普通加载并以CUDA原子存储到全局内存?

时间:2013-12-25 17:03:21

标签: cuda atomic

如果符合以下条件,CUDA中对全局内存的一般读取和写入是原子的:

  • 这是一个4字节的指令? (我假设是)
  • 这是一个8字节或16字节的指令? (我假设是)

至少在开普勒和费米上一般4字节读取和写入全局存储器原子在Warp级别或8/16字节指令原子半/四分之一Warp级别如果:

  • 所有warp线程访问相同的32字节L2事务块? (我假设是)
  • Warp线程访问不同的32字节L2事务块,但所有warp线程访问相同的128字节L2缓存线? (我假设没有)
  • 所有warp线程都访问不同的L2缓存行? (我假设没有)

如果关于经线水平原子性的任何假设都是正确的,那么是否有任何方法可以利用这些知识而不会影响未来计算能力的适应性?

1 个答案:

答案 0 :(得分:3)

读取和写入通常发生在缓存方面。在将事务发布到全局内存时,除非使用atomic指令,否则无法保证CUDA编程或内存模型中的原子性。

例如,假设线程块中的线程在Kepler上更新L2中的4字节数量。现在,在另一个warp,threadblock,或内核中的另一个线程可以在该高速缓存行被逐出全局内存之前更新L2中的这4个字节中的一个。当缓存行被驱逐到全局内存时,它可能不代表原始线程甚至第二个线程所写的内容(例如,如果第三个写入来了......)。

请记住,L2是回写式缓存,无法禁用,并且不会被全局读取和写入旁路,但atomic指令除外。