我需要一个warp的每个线程决定是否设置32位字中的相应位。这个多重设置是仅进行一次内存访问,还是每个位集的一次内存访问?
答案 0 :(得分:3)
CUDA中没有独立的位设置功能。 (在PTX中有一条bit-field-insert指令,但它仍以32位数量运行。)
每个线程通过执行完整的32位写操作来设置一个位。这样的写操作需要是原子RMW操作,以便保留其他位。因此,无论原子的吞吐量如何,访问都将被有效地序列化。
如果不考虑内存空间,将位分解为单独的整数将允许您避免原子。
然后可以使用__ballot()
warp vote function快速汇编32位打包数量。答案here中给出了一个例子。
(事实上,warp vote函数可能允许你完全避免内存事务;如果你需要的唯一结果是32位打包数量,那么一切都可以在寄存器中处理。)