Skip to content
Deepcity's Blog
Go back

Intra-ai: 重新思考并发

在 GitHub 上编辑

Intra-ai: 重新思考并发

Intra-ai引言

作为个人网站中的新专栏,Intra-ai的写作是为了在ai执行工作的过程中整理思路与经验教训。作为这个专栏的第一篇blog。在这里记录一下对于并发编程中遇到的一些问题以及我的一些想法。也许只是part1,并发编程要学的还有很多。

Bank的并发IO案例

基本上,我的场景是这样的,我需要利用多线程快速的完成对Bank的有序IO操作。在这里有两种情况

  • 直接指定IO位置,此时只需要考虑这个位置以及周边的有序即可。
  • 遍历完整的bank,此时最好需要保证整个bank中的有序。

处于对背景的解释,这里对一些基本概念做一下阐述,一般来讲一个存储器中的stack中都会有不少于256个bank,对于一整个环境而言bank的数量通常会超过1024个。对于一个bank而言,通常有32768个不同的row。在对内存进行io时,我们通常就是在对row粒度的存储体进行io操作。因此在这里我们要处理的整体是非常庞大的空间

然后是我们这里的有序以及周边的概念。

  • 有序:指的是访问总是按照特定的顺序访问一个介质空间
  • 周边:这里的周边指的不是对于一个介质位置的周边,而是针对“激活”而言的。对于一个bank来说,其在访问一个row时,通常会激活一个row以及一个特定位置的row。我们这里的周边指的就是这样一个被激活的row set的周边row。

理解了这些我们就可以开始理解接下来要讲的并发的问题了

Bank IO时的并发问题

基本上,问题发生在以下场景

  1. 我们对一个bank进行完整的有序io(每个row set), 对每个row set的访问我们保证这个最小单位内的有序
  2. 对指定IO位置的内部有序,位置间无序的访问

这个场景看起来是合理并发场景,对于每一个访问,我们限定其最小访问是目标row以及周边row即可,然后我们限定bank内的并发访问是有序的,bank间并发访问不设限即可。但问题出现在这样的一个场景,假设我们正在处理的bank数量小于 threads 的size。为了加速,我们让threads开始访问同一个bank,只保证每个线程中的访问是有序的。又或者我们指定的IO位置以及周边位置发生了重合。此时问题就出现了,主要诱因是周边这个概念,example:

  1. 当thread A试图访问 row 1 row2 row3构成的row set,thread B试图访问row 2,row 3, row4 构成的row set。

这时就出现了冲突row 2 row 3的访问不可预期。

解决方法

codex给出了一个行之有效的解决方法,据它讲,这在并发编程中有一个专业词汇:wave。基本上我看到这个词就理解了它要做什么。这与我之前学到的写算子的理论不谋而合。

image-20260807172548958

具体来说,我们给每一个thread规定一个stride,stride的大小是row set的大小。然后我们让每个thread访问row set时,按照stride的大小进行访问。这样就保证了每个thread访问的row set之间没有交集,从而避免了冲突。

并发访问下,对于每一个位置的访问次序按照alpha值标识,形状可以想像就像破浪一样,所以叫wave。

当然,这不符合我在前面提到的bank内保持有序。实际上这里只控制了局部的有规律的有序性。要做到bank级别的有序我们只需要让线程不能同时在一个bank内执行即可。

总结

很有意思的一个问题,更惊讶于我在最初设计时的疏忽。相信这会给我带来很深的印象。


在 GitHub 上编辑
Share this post on:

上一篇
Accel-Sim: An Extensible Simulation Framework for Validated GPU Modeling
下一篇
Openai Daybreak使用经历