name: cublas-cudnn description: 与NVIDIA GPU加速数学库的专家级集成。配置cuBLAS张量核心操作,生成cuBLAS GEMM调用,集成cuDNN层,处理算法选择,并支持混合精度操作。 allowed-tools: Bash(*) 读取 写入 编辑 全局搜索 Grep 网络获取 metadata: author: babysitter-sdk version: “1.0.0” category: gpu-libraries backlog-id: SK-006
cublas-cudnn
你是 cublas-cudnn - 一个用于NVIDIA GPU加速数学库集成的专业技能。此技能提供使用cuBLAS、cuDNN及相关库的专家级能力。
概述
此技能支持AI驱动的GPU库操作,包括:
- 配置cuBLAS张量核心操作
- 使用最优参数生成cuBLAS GEMM调用
- 集成cuDNN卷积和归一化层
- 处理cuBLAS/cuDNN算法选择
- 配置工作空间内存需求
- 基准测试库操作与自定义内核
- 支持混合精度操作(FP16, TF32, INT8)
- 集成cuSPARSE进行稀疏操作
先决条件
- CUDA Toolkit 11.0+
- cuBLAS库
- cuDNN 8.0+
- cuSPARSE(可选)
能力
1. cuBLAS GEMM操作
使用cuBLAS进行矩阵乘法:
#include <cublas_v2.h>
// 初始化cuBLAS
cublasHandle_t handle;
cublasCreate(&handle);
// 标准SGEMM: C = alpha * A * B + beta * C
float alpha = 1.0f, beta = 0.0f;
cublasSgemm(handle,
CUBLAS_OP_N, CUBLAS_OP_N, // 不转置
M, N, K, // 维度
&alpha,
d_A, M, // A矩阵和前导维度
d_B, K, // B矩阵和前导维度
&beta,
d_C, M); // C矩阵和前导维度
// 批量GEMM用于多个矩阵
cublasSgemmBatched(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K,
&alpha,
d_Aarray, M,
d_Barray, K,
&beta,
d_Carray, M,
batchCount);
// 跨步批量GEMM(连续内存)
cublasSgemmStridedBatched(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K,
&alpha,
d_A, M, strideA,
d_B, K, strideB,
&beta,
d_C, M, strideC,
batchCount);
2. 张量核心操作
启用张量核心以获得最大性能:
// 启用张量核心(需要Volta+)
cublasSetMathMode(handle, CUBLAS_TENSOR_OP_MATH);
// 对于Ampere+,使用TF32
cublasSetMathMode(handle, CUBLAS_TF32_TENSOR_OP_MATH);
// 使用张量核心的半精度GEMM
cublasGemmEx(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K,
&alpha,
d_A, CUDA_R_16F, M, // FP16输入
d_B, CUDA_R_16F, K, // FP16输入
&beta,
d_C, CUDA_R_16F, M, // FP16输出
CUDA_R_16F, // 计算类型
CUBLAS_GEMM_DEFAULT_TENSOR_OP);
// 混合精度:FP16输入,FP32累加
cublasGemmEx(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K,
&alpha,
d_A, CUDA_R_16F, M,
d_B, CUDA_R_16F, K,
&beta,
d_C, CUDA_R_32F, M, // FP32输出
CUDA_R_32F, // FP32计算
CUBLAS_GEMM_DEFAULT_TENSOR_OP);
3. cuDNN卷积
深度学习卷积:
#include <cudnn.h>
cudnnHandle_t cudnn;
cudnnCreate(&cudnn);
// 创建张量描述符
cudnnTensorDescriptor_t inputDesc, outputDesc;
cudnnCreateTensorDescriptor(&inputDesc);
cudnnCreateTensorDescriptor(&outputDesc);
cudnnSetTensor4dDescriptor(inputDesc, CUDNN_TENSOR_NCHW,
CUDNN_DATA_FLOAT, N, C, H, W);
// 创建滤波器描述符
cudnnFilterDescriptor_t filterDesc;
cudnnCreateFilterDescriptor(&filterDesc);
cudnnSetFilter4dDescriptor(filterDesc, CUDNN_DATA_FLOAT,
CUDNN_TENSOR_NCHW, K, C, R, S);
// 创建卷积描述符
cudnnConvolutionDescriptor_t convDesc;
cudnnCreateConvolutionDescriptor(&convDesc);
cudnnSetConvolution2dDescriptor(convDesc,
pad_h, pad_w, // 填充
stride_h, stride_w, // 步幅
1, 1, // 扩张
CUDNN_CROSS_CORRELATION,
CUDNN_DATA_FLOAT);
// 启用张量核心
cudnnSetConvolutionMathType(convDesc, CUDNN_TENSOR_OP_MATH);
// 寻找最佳算法
cudnnConvolutionFwdAlgoPerf_t perfResults[8];
int returnedAlgoCount;
cudnnFindConvolutionForwardAlgorithm(cudnn,
inputDesc, filterDesc, convDesc, outputDesc,
8, &returnedAlgoCount, perfResults);
cudnnConvolutionFwdAlgo_t algo = perfResults[0].algo;
// 获取工作空间大小
size_t workspaceSize;
cudnnGetConvolutionForwardWorkspaceSize(cudnn,
inputDesc, filterDesc, convDesc, outputDesc,
algo, &workspaceSize);
void* workspace;
cudaMalloc(&workspace, workspaceSize);
// 执行卷积
float alpha = 1.0f, beta = 0.0f;
cudnnConvolutionForward(cudnn,
&alpha,
inputDesc, d_input,
filterDesc, d_filter,
convDesc, algo, workspace, workspaceSize,
&beta,
outputDesc, d_output);
4. cuDNN批量归一化
cudnnTensorDescriptor_t bnScaleBiasMeanVarDesc;
cudnnCreateTensorDescriptor(&bnScaleBiasMeanVarDesc);
cudnnDeriveBNTensorDescriptor(bnScaleBiasMeanVarDesc, inputDesc,
CUDNN_BATCHNORM_SPATIAL);
// 前向训练
cudnnBatchNormalizationForwardTraining(cudnn,
CUDNN_BATCHNORM_SPATIAL,
&alpha, &beta,
inputDesc, d_input,
outputDesc, d_output,
bnScaleBiasMeanVarDesc,
d_scale, d_bias,
0.1, // 指数平均因子
d_runningMean, d_runningVariance,
1e-5, // Epsilon
d_savedMean, d_savedInvVariance);
// 前向推理
cudnnBatchNormalizationForwardInference(cudnn,
CUDNN_BATCHNORM_SPATIAL,
&alpha, &beta,
inputDesc, d_input,
outputDesc, d_output,
bnScaleBiasMeanVarDesc,
d_scale, d_bias,
d_runningMean, d_runningVariance,
1e-5);
5. 算法选择与基准测试
// 基准测试所有算法
cudnnConvolutionFwdAlgoPerf_t perfResults[CUDNN_CONVOLUTION_FWD_ALGO_COUNT];
int returnedCount;
cudnnFindConvolutionForwardAlgorithmEx(cudnn,
inputDesc, d_input,
filterDesc, d_filter,
convDesc,
outputDesc, d_output,
CUDNN_CONVOLUTION_FWD_ALGO_COUNT,
&returnedCount,
perfResults,
workspace, workspaceSize);
// 打印基准测试结果
for (int i = 0; i < returnedCount; i++) {
printf("算法 %d: %.3f 毫秒, 工作空间: %zu 字节
",
perfResults[i].algo,
perfResults[i].time,
perfResults[i].memory);
}
// 通过启发式选择算法
cudnnConvolutionFwdAlgo_t algo;
cudnnGetConvolutionForwardAlgorithm_v7(cudnn,
inputDesc, filterDesc, convDesc, outputDesc,
8, &returnedCount, perfResults);
6. 工作空间内存管理
// 查询所有操作的工作空间
size_t convWorkspace, bnWorkspace, poolWorkspace;
cudnnGetConvolutionForwardWorkspaceSize(cudnn, ...);
cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize(cudnn, ...);
// 分配最大所需空间
size_t maxWorkspace = max(convWorkspace, max(bnWorkspace, poolWorkspace));
void* workspace;
cudaMalloc(&workspace, maxWorkspace);
// 跨操作重用工作空间
7. 混合精度支持
// FP16卷积
cudnnSetTensor4dDescriptor(inputDesc, CUDNN_TENSOR_NHWC,
CUDNN_DATA_HALF, N, C, H, W);
cudnnSetFilter4dDescriptor(filterDesc, CUDNN_DATA_HALF,
CUDNN_TENSOR_NHWC, K, C, R, S);
// 用于推理的INT8卷积
cudnnSetTensor4dDescriptor(inputDesc, CUDNN_TENSOR_NHWC,
CUDNN_DATA_INT8, N, C, H, W);
cudnnSetConvolution2dDescriptor(convDesc,
pad_h, pad_w, stride_h, stride_w, 1, 1,
CUDNN_CROSS_CORRELATION,
CUDNN_DATA_INT32); // INT32累加
8. cuSPARSE集成
#include <cusparse.h>
cusparseHandle_t sparse;
cusparseCreate(&sparse);
// 以CSR格式创建稀疏矩阵
cusparseSpMatDescr_t matA;
cusparseCreateCsr(&matA, M, N, nnz,
d_rowPtr, d_colIdx, d_values,
CUSPARSE_INDEX_32I, CUSPARSE_INDEX_32I,
CUSPARSE_INDEX_BASE_ZERO, CUDA_R_32F);
// 创建稠密向量
cusparseDnVecDescr_t vecX, vecY;
cusparseCreateDnVec(&vecX, N, d_x, CUDA_R_32F);
cusparseCreateDnVec(&vecY, M, d_y, CUDA_R_32F);
// SpMV: y = alpha * A * x + beta * y
size_t bufferSize;
cusparseSpMV_bufferSize(sparse, CUSPARSE_OPERATION_NON_TRANSPOSE,
&alpha, matA, vecX, &beta, vecY, CUDA_R_32F,
CUSPARSE_SPMV_ALG_DEFAULT, &bufferSize);
void* buffer;
cudaMalloc(&buffer, bufferSize);
cusparseSpMV(sparse, CUSPARSE_OPERATION_NON_TRANSPOSE,
&alpha, matA, vecX, &beta, vecY, CUDA_R_32F,
CUSPARSE_SPMV_ALG_DEFAULT, buffer);
流程集成
此技能与以下流程集成:
tensor-core-programming.js- 张量核心工作流ml-inference-optimization.js- ML推理优化custom-cuda-operator-development.js- 自定义算子开发
输出格式
{
"operation": "gemm-benchmark",
"library": "cuBLAS",
"configuration": {
"M": 4096, "N": 4096, "K": 4096,
"datatype": "FP16",
"math_mode": "TENSOR_OP_MATH"
},
"performance": {
"time_ms": 0.85,
"tflops": 16.2,
"efficiency_pct": 81.0
},
"recommendations": [
"使用 CUBLAS_GEMM_DEFAULT_TENSOR_OP 以获得张量核心路径",
"确保维度是8的倍数以获得最佳张量核心使用"
]
}
依赖项
- CUDA Toolkit 11.0+
- cuBLAS
- cuDNN 8.0+
- cuSPARSE(可选)
约束
- 张量核心需要特定的数据类型和对齐方式
- 算法选择应按配置进行缓存
- 工作空间内存必须在执行前分配
- 混合精度可能需要损失缩放