DeepSeek绕开CUDA垄断?深入解析CUDA、PTX与SASS的关系
DeepSeek绕开CUDA垄断?深入解析CUDA、PTX与SASS的关系
近期,关于DeepSeek通过使用PTX来优化性能的讨论引发了广泛关注。有人认为这打破了英伟达CUDA的垄断,但这种观点实际上是对CUDA本质的误解。本文将深入探讨CUDA、PTX和SASS的关系,以及它们在GPU计算中的作用。
CUDA、PTX和SASS的关系
GPU和CPU的工作原理相似,都是通过指令来控制硬件实现计算。但是GPU更专注于矩阵计算。接下来,我们来梳理一下GPU的结构以及英伟达所建立的CUDA生态。
GPU的结构相对简单,通过大量简单的核结构(数千个),采用SIMT(单指令多线程)模型,通过线程级并行隐藏延迟,来完成高吞吐量的数据密集型任务(如图形渲染、科学计算)。
正是由于GPU的结构简单,因此采用CPU来控制GPU的单元,使它们协同工作。其中,在CPU上运行的代码称为host代码,在GPU上运行的代码称为device代码。
进一步探究,我们会发现英伟达提供了一种中间汇编语言PTX(Parallel Thread Execution),这是一种独立于具体硬件的虚拟指令集,专门用于GPU。在PTX之下,是真正执行GPU硬件的机器码SASS(Shader Assembly),由PTX编译生成(如NVIDIA的nvcc编译器完成转换)。
PTX是虚拟汇编,用于跨代GPU兼容;SASS是硬件原生指令,直接控制CUDA核心。例如,PTX指令add.s32 %r1, %r2, %r3
会被编译为特定GPU架构的SASS指令。
CUDA的作用
CUDA(Compute Unified Device Architecture)是由NVIDIA推出的并行计算平台和编程模型,其编程接口基于扩展的C/C++语法。严格来说,CUDA并不是一门独立的编程语言,而是一套面向GPU的编程扩展,属于高级语言的范畴,但提供了直接控制硬件的能力。
简单理解,可以把CUDA看作是一个C/C++语言的增强包,通过这种方式可以直接用C++的方式来操作硬件。
DeepSeek到底做了什么?
DeepSeek通过在代码中利用CUDA提供的方式来完成性能优化。具体来说,就是通过内联PTX来实现更低级的调用。例如:
__device__ int atomicAdd(int* address, int val) {
int old = *address;
asm volatile ("atom.global.add.s32 %0, [%1], %2;" : "=r"(old) : "l"(address), "r"(val));
return old;
}
CUDA还提供了内存修饰符、Warp级操作等更接近硬件层的优化接口。这类似于在C语言中调用CPU的汇编语句。
打破CUDA垄断?
从上述分析可以看出,DeepSeek并没有打破CUDA的垄断,而是对CUDA的熟练应用,同时展示了对GPU底层训练逻辑的深刻理解。英伟达最强大的地方在于构建了CUDA生态,相当于为GPU建立了一个定制化的语言体系,可以直接操作GPU来完成具体工作。
简单来说,英伟达完成了从指令集(SASS)、汇编语言(PTX)到高级语言增强包的完整技术栈。英伟达的护城河就是CUDA生态,而DeepSeek也是这个生态的受益者。