原子操作简介【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitSIMT原子操作用于保证对同一地址的一次读-改-写过程具有原子性可避免多个线程并发更新同一地址时出现更新丢失。原子操作常用于计数、状态抢占、直方图统计、并行归约和共享状态位更新等场景。原子操作保证单次内存更新不可被其他线程打断但不保证多个线程到达该原子操作的先后顺序也不能替代线程同步屏障功能。访问空间原子操作可以作用于Global Memory或Unified Buffer。不同内存空间的作用范围、适用场景和性能特征不同。访问空间作用范围典型用途性能特征Global MemoryGrid内线程可访问全局计数、跨线程块汇总、最终结果写回访问路径较长跨线程块或跨核竞争同一地址时开销较高Unified Buffer线程块内线程可访问局部统计、块内归约、临时直方图位于片上内存访问延迟通常低于Global Memory但作用范围仅限当前线程块不同接口、不同数据类型支持的内存空间存在差异具体请参见各接口文档中的“不同数据类型支持的内存范围”。确定性原子操作可以避免数据竞争造成的更新丢失但不一定保证结果在所有场景下完全确定。对于整数计数类操作如果不发生溢出最终计数值通常是确定的。例如所有线程执行asc_atomic_add(counter, 1U)接口最终结果等于参与累加的线程数量。对于依赖原子操作返回值的场景输出顺序通常不确定。例如以下写法可以获得唯一写入位置但不同线程获得的位置顺序可能随调度变化uint32_t pos asc_atomic_add(count, 1U); out[pos] value;对于抢占类场景例如使用asc_atomic_cas接口将某个状态从0改为线程ID原子操作可以保证最多一个线程抢占成功但无法保证固定由哪个线程抢占成功。对于浮点累加类场景由于浮点加法不满足严格结合律不同线程的串行化顺序可能导致低位舍入差异。如果业务要求逐bit一致应避免将大量浮点数据直接原子累加到同一个Global Memory地址可改用固定顺序的分层归约。性能影响原子操作的性能主要受访问空间、冲突程度和返回值依赖影响。Global Memory原子操作Global Memory原子操作适合做最终结果汇总但不适合高频热点更新。多个线程块或多个核同时访问同一Global Memory地址时请求会在该地址上排队吞吐会明显下降。例如所有线程都访问同一个counterasc_atomic_add(counter, 1U);该地址会成为热点程序可能从并行执行退化为大量原子请求串行执行。Unified Buffer原子操作Unified Buffer原子操作适合线程块内局部聚合。相比直接写Global Memory它可以减少全局内存访问和跨线程块竞争。但Unified Buffer的作用范围有限不能直接替代跨线程块共享的Global Memory结果。常见优化方式如下每个线程先在寄存器中计算局部结果。线程块内使用Unified Buffer进行局部累加或归约。每个线程块只对Global Memory执行少量原子操作。同一Warp访问同一地址同一Warp内多个线程同时对同一地址执行原子操作是常见的性能瓶颈。虽然Warp中的线程在执行模型上并行发起请求但同一地址的原子读-改-写必须串行完成。例如一个Warp内32个线程同时执行asc_atomic_add(counter, 1U);这些请求会在counter地址上串行化。若其他Warp或线程块也访问同一地址串行化范围会进一步扩大。如果业务允许可先在Warp或线程块内合并增量再由少数线程执行原子操作。例如对计数场景可以先统计当前Warp内满足条件的线程数量再由一个线程执行一次asc_atomic_add接口。使用建议仅在确实存在并发写同一地址且需要保证更新不丢失时使用原子操作。避免所有线程频繁原子更新同一个Global Memory地址。优先采用寄存器或Unified Buffer进行局部聚合再写回Global Memory。不要依赖原子操作返回值表达稳定的线程执行顺序。浮点累加要求逐bit一致时应使用固定顺序归约避免直接高并发原子累加。使用asc_atomic_cas实现抢占逻辑时应保证业务只要求“有一个线程成功”而不是要求固定线程成功。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考