Nvidia GPU与CUDA的良性数据竞争条件资格?

时间:2012-06-29 16:10:56

标签: c cuda gpgpu race-condition

作为我的问题的快速背景,使用x86,可以保证对于32位字进行4字节对齐的单个存储器访问,或者对于64位字进行8字节对齐的单个存储器访问将是原子的。因此,您可以创建“良性数据竞争”,其中至少一个线程写入内存地址,另一个线程从同一地址读取,并且读取器将看不到不完整写入的结果。读取线程将看到写入的整个效果,或者它不会。

创建这些类型的“良性”数据竞争条件的CUDA编程模型有哪些要求?例如,如果两个独立的线程从两个不同的SM上的两个独立但同时运行的块将64位值写入相同的全局内存地址,则每个线程将原子地写入其整个64位值,而第三个观察者仅读回一个完全更新的64位内存块?或者写入是否会以较小的粒度进行,因此第三个观察者只有在两个线程同时写入内存后尝试从内存地址读回时才会看到部分写入?

我知道竞争条件通常是要避免的,但如果放宽了对内存排序的要求,则无需明确使用原子读/写函数。话虽如此,这取决于单个读/写的原子性是什么(即,多少位,以及什么对齐)。有谁知道我在哪里可以找到这些信息?

1 个答案:

答案 0 :(得分:1)

更新:@Heatsink已经通知我,使用__threadfence()功能确实可以强制一些内存一致性。

-

除非使用原子函数,否则在访问由同一内核调用中调度的任何线程更新的全局内存时,CUDA特别不保证任何一致性。读取由先前内核或内存副本写入的内存是安全的。

因此,您不仅不能假设有关内存访问模式的任何内容 - 您甚至无法知道一个线程对全局内存执行的更新何时可能对另一个线程可见,或者实际上,如果将完全可见

当然,考虑到在给定体系结构中实现硬件的方式,您可能能够找到一种在线程之间实现某种类型的非阻塞同步的方法。但是,我真诚地怀疑在块之间安全地做到这一点是可能的。一个块中的线程看到的内容取决于块运行的SM,以前运行的块,以及这些块当前在缓存层次结构中完成的更新。

在考虑块内的线程时,讨论没有实际意义,因为块中的线程可以与共享内存进行通信,其行为由CUDA仔细指定。