Matrix Transpose

338 字
2 分钟
Matrix Transpose

题面#

答案#

#include <cuda_runtime.h>
__global__ void matrix_transpose_kernel(const float* input, float* output, int rows, int cols) {
int row = blockDim.y * blockIdx.y + threadIdx.y;
int col = blockDim.x * blockIdx.x + threadIdx.x;
if (row >= rows || col >= cols) return;
int input_index = row * cols + col;
int output_index = col * rows + row;
output[output_index] = input[input_index];
}
// input, output are device pointers (i.e. pointers to memory on the GPU)
extern "C" void solve(const float* input, float* output, int rows, int cols) {
dim3 threadsPerBlock(16, 16);
dim3 blocksPerGrid((cols + threadsPerBlock.x - 1) / threadsPerBlock.x,
(rows + threadsPerBlock.y - 1) / threadsPerBlock.y);
matrix_transpose_kernel<<<blocksPerGrid, threadsPerBlock>>>(input, output, rows, cols);
cudaDeviceSynchronize();
}

两级组织:Grid → Block → Thread#

CUDA 线程按两级结构组织,每个线程的全局坐标由 三部分拼成

row = blockIdx.y × blockDim.y + threadIdx.y
col = blockIdx.x × blockDim.x + threadIdx.x
部分含义类比
blockIdx你在第几个块第几辆车
blockDim每块多少线程每辆车多少座位
threadIdx你在块内排第几车里的第几排第几座

示例计算#

假设 blockDim = (16, 16),某线程在 Block(1,0) 中处于 threadIdx = (2, 3)

col = 1×16 + 2 = 18 ← 前面 1 整块(16列) + 块内第 2 个
row = 0×16 + 3 = 3 ← 前面 0 整块 + 块内第 3 个

→ 该线程负责计算 output 的 [18][3](对应 input 的 [3][18])。

转置中的应用#

int input_index = row * cols + col; // input[row][col]
int output_index = col * rows + row; // output[col][row] ← 行列互换

每个线程读一个元素,写一个元素,无需同步——天然并行。

Matrix Transpose
https://dongyanzhang.com/posts/leetgpu/matrix-transpose/
作者
阿东阿言
发布于
2026-07-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
阿东阿言
I share my notes | projects | experience here...
公告
欢迎来到阿东阿言的博客
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
25
分类
3
标签
5
总字数
11,186
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
v1.0.0
文章许可
CC BY-NC-SA 4.0