用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/mindspore-ai/akg --skill cuda-c-patterns命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
矩阵乘法矩阵乘法 A[M, K] @ B[K, N] = C[M, N]中,大K维度矩阵乘法(K>>M,N)优化:针对M/N较小但K极大(如M=N=256,K=131072)的场景,Split-K切分K维度并行化、Workspace+Reduce替代全局同步,实现显著性能提升
Triton Ascend hard API restrictions and forbidden syntax. MUST-follow rules that apply to every kernel: forbidden control flow (return/break/continue/lambda/while), tensor slice/index restrictions, scalar conversion rules, BLOCK_SIZE upper bound. Violating any of these produces a compile or runtime error on Ascend.
Triton Ascend 性能优化通用策略: BLOCK_SIZE 选择 (1024-2048 for elementwise, must be <65536), grid configuration (use VEC_CORE_NUM / CUBE_CORE_NUM, 2D/3D grid for matmul / conv / reduce, 1D grid + inner loop for elementwise / pointwise), 256B alignment for memory transfers, autotune block-size patterns, fp16 / fp32 precision conversion. Bind via keywords like matmul, elementwise, reduce, block_size, grid, autotune, alignment, fp16, fp32, tile, interleaved-loop, cube-core, vec-core.
基于 SOC 职业分类
正在显示 SKILL.md
| name | cuda-c-patterns |
| description | CUDA C 三大编程模式:向量操作、归约、矩阵乘法 |
| category | method |
| version | 1.0.0 |
| metadata | {"backend":"cuda","dsl":"cuda_c","operator_patterns":"elementwise, reduce, matmul"} |
适用于元素级运算:加法、乘法、激活函数等。
__global__ void vector_add_kernel(
const float* a, const float* b, float* c, int n_elements
) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n_elements) {
c[idx] = a[idx] + b[idx];
}
}
blockIdx.x * blockDim.x + threadIdx.xif (idx < n_elements)__global__ void relu_kernel(
const float* input, float* output, int n
) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
output[idx] = fmaxf(input[idx], 0.0f);
}
}
__global__ void gelu_kernel(
const float* input, float* output, int n
) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
float x = input[idx];
// 近似 GELU: 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3)))
float cdf = 0.5f * (1.0f + tanhf(0.7978845608f * (x + 0.044715f * x * x * x)));
output[idx] = x * cdf;
}
}
__global__ void fused_multiply_add_kernel(
const float* a, const float* b, const float* c,
float* output, int n
) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
output[idx] = a[idx] * b[idx] + c[idx];
}
}
适用于求和、最大值、最小值等聚合操作。
__global__ void reduction_sum_kernel(
const float* input, float* output, int n_elements
) {
extern __shared__ float sdata[];
int tid = threadIdx.x;
int idx = blockIdx.x * blockDim.x + threadIdx.x;
// 加载数据到共享内存
sdata[tid] = (idx < n_elements) ? input[idx] : 0.0f;
__syncthreads();
// 块内归约(树形归约)
for (int s = blockDim.x / 2; s > 0; s >>= 1) {
if (tid < s) {
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
// 第一个线程写入块级结果
if (tid == 0) {
atomicAdd(output, sdata[0]);
}
}
extern __shared__ 声明动态共享内存__syncthreads() 确保数据一致性atomicAdd 用于跨 block 的全局归约__global__ void softmax_kernel(
const float* input, float* output, int rows, int cols
) {
int row = blockIdx.x;
if (row >= rows) return;
const float* row_input = input + row * cols;
float* row_output = output + row * cols;
// 1. 找最大值(数值稳定)
float max_val = -INFINITY;
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
max_val = fmaxf(max_val, row_input[i]);
}
// Warp 内归约最大值
for (int offset = warpSize / 2; offset > 0; offset >>= 1) {
max_val = fmaxf(max_val, __shfl_down_sync(0xFFFFFFFF, max_val, offset));
}
// 通过共享内存跨 warp 归约
__shared__ float s_max;
if (threadIdx.x == 0) s_max = max_val;
__syncthreads();
max_val = s_max;
// 2. 计算 exp 和 sum
float sum = 0.0f;
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
sum += __expf(row_input[i] - max_val);
}
// 归约 sum
for (int offset = warpSize / 2; offset > 0; offset >>= 1) {
sum += __shfl_down_sync(0xFFFFFFFF, sum, offset);
}
__shared__ float s_sum;
if (threadIdx.x == 0) s_sum = sum;
__syncthreads();
sum = s_sum;
// 3. 计算 softmax
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
row_output[i] = __expf(row_input[i] - max_val) / sum;
}
}
__global__ void layer_norm_kernel(
const float* input, float* output,
const float* gamma, const float* beta,
int rows, int cols, float eps
) {
int row = blockIdx.x;
if (row >= rows) return;
const float* row_input = input + row * cols;
float* row_output = output + row * cols;
// 1. 计算均值
float sum = 0.0f;
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
sum += row_input[i];
}
// warp 归约
for (int offset = warpSize / 2; offset > 0; offset >>= 1) {
sum += __shfl_down_sync(0xFFFFFFFF, sum, offset);
}
__shared__ float s_mean;
if (threadIdx.x == 0) s_mean = sum / cols;
__syncthreads();
float mean = s_mean;
// 2. 计算方差
float var_sum = 0.0f;
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
float diff = row_input[i] - mean;
var_sum += diff * diff;
}
for (int offset = warpSize / 2; offset > 0; offset >>= 1) {
var_sum += __shfl_down_sync(0xFFFFFFFF, var_sum, offset);
}
__shared__ float s_var;
if (threadIdx.x == 0) s_var = var_sum / cols;
__syncthreads();
float rstd = rsqrtf(s_var + eps);
// 3. 归一化
for (int i = threadIdx.x; i < cols; i += blockDim.x) {
float normalized = (row_input[i] - mean) * rstd;
row_output[i] = normalized * gamma[i] + beta[i];
}
}
适用于矩阵乘法等多维块计算。
__global__ void matmul_kernel(
const float* A, const float* B, float* C,
int M, int N, int K
) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < M && col < N) {
float sum = 0.0f;
for (int k = 0; k < K; k++) {
sum += A[row * K + k] * B[k * N + col];
}
C[row * N + col] = sum;
}
}
#define TILE_SIZE 16
__global__ void matmul_shared_kernel(
const float* A, const float* B, float* C,
int M, int N, int K
) {
__shared__ float As[TILE_SIZE][TILE_SIZE];
__shared__ float Bs[TILE_SIZE][TILE_SIZE];
int row = blockIdx.y * TILE_SIZE + threadIdx.y;
int col = blockIdx.x * TILE_SIZE + threadIdx.x;
float sum = 0.0f;
for (int t = 0; t < (K + TILE_SIZE - 1) / TILE_SIZE; t++) {
// 加载到共享内存
int a_col = t * TILE_SIZE + threadIdx.x;
int b_row = t * TILE_SIZE + threadIdx.y;
As[threadIdx.y][threadIdx.x] = (row < M && a_col < K) ? A[row * K + a_col] : 0.0f;
Bs[threadIdx.y][threadIdx.x] = (b_row < K && col < N) ? B[b_row * N + col] : 0.0f;
__syncthreads();
// 计算部分乘积
for (int k = 0; k < TILE_SIZE; k++) {
sum += As[threadIdx.y][k] * Bs[k][threadIdx.x];
}
__syncthreads();
}
if (row < M && col < N) {
C[row * N + col] = sum;
}
}
dim3 配置二维网格和线程块__syncthreads()// 朴素版启动
dim3 block(16, 16);
dim3 grid((N + 15) / 16, (M + 15) / 16);
matmul_kernel<<<grid, block>>>(A, B, C, M, N, K);
// 共享内存版启动
dim3 block(TILE_SIZE, TILE_SIZE);
dim3 grid((N + TILE_SIZE - 1) / TILE_SIZE, (M + TILE_SIZE - 1) / TILE_SIZE);
matmul_shared_kernel<<<grid, block>>>(A, B, C, M, N, K);
| 算子类型 | 推荐模式 | 关键特征 | 块大小 |
|---|---|---|---|
| Element-wise | 向量操作 | 逐元素独立计算 | 256/512 |
| Reduction | 归约模式 | 需要聚合多个值 | 256 |
| MatMul/Conv | 矩阵乘法 | 多维块计算,2D Grid | 16x16/32x32 |
| Softmax/Norm | 归约+元素操作 | 行级归约+逐元素 | 256 |
| Attention | 组合模式 | MatMul + Softmax | 视情况而定 |
if (idx < n) 处理不规则形状__syncthreads() 必须所有线程到达