## 从“用不了”到“跑得快”:rocBLAS如何让国产DCU真正“算起来”
如果你接触过国产加速卡,一定听过这样的抱怨:“硬件参数挺好看,但软件生态跟不上,很多库用不了。”
这话放在几年前没错。但今天,情况已经大不相同。
以海光DCU为例,它的软件生态已经覆盖了从底层驱动到上层框架的完整链条。其中最关键的一环,就是**rocBLAS**——一套让DCU“算得起来”的基础线性代数库。
### 一、rocBLAS是什么?一句话说清楚
**rocBLAS就是DCU上的BLAS库。**
BLAS(Basic Linear Algebra Subprograms,基础线性代数子程序)是科学计算和AI训练的“地基”。你在PyTorch里训练模型、在GROMACS里做分子动力学模拟、在OpenFOAM里算流体力学——底层都在调用BLAS库做矩阵乘法和向量运算。
rocBLAS就是这套地基在DCU上的实现。它用HIP语言写成,专门针对DCU的架构做优化。你写的程序调用rocBLAS,就相当于告诉DCU:“帮我算个矩阵乘法,要快。”
### 二、rocBLAS能做什么?
rocBLAS实现了BLAS的三个层级:
**Level 1**:向量-向量运算。比如两个向量相加(AXPY)、求点积(DOT)、算范数(NRM2)。这些操作看着简单,但在迭代式算法里被调用成千上万次,性能差异会累积成巨大差距。
**Level 2**:矩阵-向量运算。比如矩阵乘向量(GEMV)。这是很多科学计算的核心操作——有限元分析、流体模拟里大量存在。
**Level 3**:矩阵-矩阵运算。比如通用矩阵乘法(GEMM)。这是**AI训练的命脉**——Transformer里的QKV投影、Attention计算、FFN层,本质上都是GEMM。
rocBLAS对每种精度都提供了完整支持:单精度(float)、双精度(double)、半精度(FP16)、BF16,甚至还有8位整数(int8)。这意味着你可以在科学计算中用双精度保证数值准确性,在AI训练中用半精度榨干DCU的算力。
### 三、从0到1:一个最简单的rocBLAS程序
光说不练假把式。来看一个用rocBLAS做矩阵乘法的完整例子:
```cpp
#include
#include
int main() {
const int M = 2, N = 3, K = 4;
float alpha = 1.0f, beta = 0.0f;
// 主机端数据(列主序)
float h_A[M*K] = {1,2,3,4, 5,6,7,8}; // A: M×K
float h_B[K*N] = {1,2,3, 4,5,6, 7,8,9, 10,11,12}; // B: K×N
float h_C[M*N] = {0}; // C: M×N(结果)
// 在DCU上分配显存
float *d_A, *d_B, *d_C;
hipMalloc(&d_A, M*K*sizeof(float));
hipMalloc(&d_B, K*N*sizeof(float));
hipMalloc(&d_C, M*N*sizeof(float));
// 数据从CPU拷到DCU
hipMemcpy(d_A, h_A, sizeof(h_A), hipMemcpyHostToDevice);
hipMemcpy(d_B, h_B, sizeof(h_B), hipMemcpyHostToDevice);
// 创建rocBLAS句柄
rocblas_handle handle;
rocblas_create_handle(&handle);
// 执行矩阵乘法:C = alpha * A * B + beta * C
rocblas_sgemm(handle,
rocblas_operation_none, rocblas_operation_none,
M, N, K,
&alpha, d_A, M, d_B, K,
&beta, d_C, M);
// 结果拷回CPU
hipMemcpy(h_C, d_C, sizeof(h_C), hipMemcpyDeviceToHost);
// 打印结果
for(int i = 0; i < M; ++i) {
for(int j = 0; j < N; ++j) {
std::cout << h_C[i + j*M] << " ";
}
std::cout << std::endl;
}
// 清理资源
rocblas_destroy_handle(handle);
hipFree(d_A); hipFree(d_B); hipFree(d_C);
return 0;
}
```
**注意到什么了吗?** 除了头文件和函数名前缀从 `cublas`换成 `rocblas`,这段代码和CUDA版本的写法几乎一模一样。`hipMalloc`对应 `cudaMalloc`,`hipMemcpy`对应 `cudaMemcpy`——写过CUDA的人,上手rocBLAS几乎零成本。
编译也很简单:
```bash
hipcc demo_sgemm.cpp -o demo_sgemm -lrocblas
```
运行后你会得到矩阵乘法的正确结果。
### 四、rocBLAS的“隐藏武器”:扩展API
传统的BLAS接口是固定的——输入什么精度,输出什么精度,中间计算用什么精度,都是绑定的。但rocBLAS提供了一套**扩展API(Extended API)** ,让你可以**混合精度**计算。
什么意思?举个例子:
你在训练一个大模型,想用FP16存数据以节省显存,但又担心FP16的精度不够导致梯度下溢。用rocBLAS的扩展API,你可以这样做:
- 输入矩阵A和B用**FP16**存(省显存)
- 但中间计算用**FP32**累加(保精度)
- 输出结果用**FP16**(省显存)
```cpp
rocblas_gemm_ex(handle, transA, transB, m, n, k,
alpha,
A, rocblas_datatype_f16_r, lda, // A用FP16
B, rocblas_datatype_f16_r, ldb, // B用FP16
beta,
C, rocblas_datatype_f16_r, ldc, // C用FP16
D, rocblas_datatype_f16_r, ldd, // D用FP16
rocblas_datatype_f32_r, // 但中间计算用FP32!
algo, solution_index, flags);
```
这种“混合精度”能力在AI训练中极其重要——**既享受了半精度的高吞吐,又保留了单精度的数值稳定性**。
### 五、rocBLAS在DCU上跑得怎么样?
说了这么多“能做什么”,最关键的问题来了:**在DCU上跑rocBLAS,性能到底行不行?**
答案是:**不仅行,而且越来越行。**
2025年发表的研究表明,在海光DCU Z100SM上,经过针对性优化的GEMV(矩阵-向量乘)算法,性能比rocBLAS原生实现**最高提升了3倍**。
3倍是什么概念?同样的硬件、同样的计算任务,只是优化了算法实现方式,速度就翻了3倍。这说明**DCU的硬件潜力远未被充分挖掘**,而rocBLAS作为基础库,正是释放这种潜力的关键通道。
在大语言模型训练场景中,研究人员发现矩阵转置对rocBLAS中GEMM核函数的性能影响显著,并提出了“最小化转置”和“自适应转置”两种优化方法,**有效降低了训练耗时**。这些优化已经进入了PyTorch的线性层实现——你在DCU上跑PyTorch训练时,已经在不知不觉中受益于这些改进了。
海光DCU的软件栈基于AMD开源的ROCm平台定制,而rocBLAS作为ROCm生态的核心组件,也在持续迭代。最新版本的rocBLAS针对gfx942(对应DCU的高端型号)做了大量优化:GEMM在适用场景下会调用GEMV内核加速、小矩阵大批量的GEMV性能提升、大向量的点积性能优化。
### 六、为什么rocBLAS对国产算力生态至关重要?
rocBLAS的意义,远不止于“一个能用的数学库”。
**第一,它是生态的“地基”** 。没有rocBLAS,PyTorch跑不起来、TensorFlow跑不起来、各种科学计算软件都跑不起来。rocBLAS的存在,让DCU从“能看”变成了“能用”。
**第二,它是性能的“天花板”** 。硬件算力再高,如果基础库没优化好,最终应用性能也上不去。rocBLAS的持续优化,直接决定了DCU在AI训练、科学计算中的实际表现。
**第三,它是迁移的“桥梁”** 。rocBLAS的API设计与cuBLAS高度一致,这意味着大量现有的CUDA代码可以低成本迁移到DCU上。开发者不需要重新学习一套全新的编程模型。
在国产加速卡生态建设的大背景下,rocBLAS这样的基础库,正在把“国产硬件”从**政策驱动的选择**变成**性能驱动的选择**。
### 七、总结
回到开头的问题:**国产加速卡能不能用?**
能。而且正在从“能用”走向“好用”。
rocBLAS就是最好的证明——它让DCU能跑标准的BLAS程序,支持混合精度,持续性能优化,API设计让CUDA开发者几乎无缝迁移。从一段20行的矩阵乘法代码,到千亿参数大模型的分布式训练,底层都离不开rocBLAS的支撑。
下次你再听到“国产加速卡软件生态不行”的说法时,可以告诉他们:**rocBLAS已经让DCU“算得起来”了,而且正在“算得越来越快”。**