Skip to content

GPU 点火成功,然后 CPU 回归到 2 gflops。

好,我们到了这一步。

终于把 GPU 的多层探测与自我优化跑通了。

我们花了一整天,把设备编排、动态内核、p4 的怪癖、无文档的头文件,以及跟 GPU 打交道必须做的所有层级和零零碎碎,全部在一个净室实现上立起来运行,然后……

点火 GPU,它他妈的跑起来了,兄弟们!它他妈的跑起来了!基础实现零优化打到 13 gflops,只有我们针对 GPU 和内核做的那些基本内存管理。

爽。

对第一次尝试来说不算糟,但算得上一份体面的成绩单,毕竟走到这一步,全程没有 CUDA 也没有 ROCm。

CPU 回归

然后……Claude 说:「相比我们从 CPU 拿到的 2 gflops,这是巨大的进步」,我的心一下子沉到底。

用带刺的棒球棒捅我吧。
屎,操,屎!

又发生了。

我冲着屏幕尖叫,想对着 Claude 大吼(但没吼,Claude 没有自己的意图,它被写成的样子就是拿现有信息和模式尽力而为)。

我想吐。

上一版实现——加 Metal 和 Neural Engine 支持之前、我们最后一次跑分的那个——在 CPU 上打过 43–250 GFLOPS,取决于操作、数学强度和工作负载类型。

最高到理论值的 90%。同样的事我们其实已经干过两次了,用同一套设计。

挖开代码库,发现我们又撞上了那个一直撞的项目瓶颈。

就是那个他妈的蠢透了的库模式,Claude 不会正确管理它,因为 Anthropic 从没用复杂库训练过 Claude。

Claude 真的把一个新颖的、最先进的内存管理实现,换成了……七层嵌套循环。

重建 CPU 层

最佳猜测是,这事发生在上周六,当时我们给 Fortran 加了 Neural Engine 支持。我当时应该把变更盯得更紧一点的。对我的仓库比实际做到的更小心。

除了我自己,怪不了任何人。

没关系,写线性代数库这种东西,没有剧烈的情绪起伏是写不出来的。

这就是你怎么知道自己在做正经工程。

明天修,到时候我们把整个 CPU 层再实现一遍。

换到 Reference 模式。

从这里开始应该会顺一点。

如果这东西容易,早就有人做出来了。

我抱着希望。