#define CUDA_CHECK(call) \ do { \ cudaError_t const status = (call); \ if (status != cudaSuccess) { \ std::cerr << std::format("硬件状态异常诊断:\n API: {}\n 错误: {}\n 位置: {}:{}\n", \ #call, cudaGetErrorString(status), FILE, LINE); \ std::exit(EXIT_FAILURE); \ } \ } while (0)
// 方案 A:按行读取(合并访存),按列写入(跨步访存) __global__ voidtransposeReadRowWriteCol(constfloat* restrict A, float* restrict B, int N){ int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y; if (x < N && y < N) { // 读取 A: 相邻线程的 x 连续递增,物理地址连续 -> 合并读取 // 写入 B: 相邻线程的 x 连续递增,物理地址间隔 N -> 跨步写入 B[x * N + y] = A[y * N + x]; } } // 方案 B:按列读取(跨步访存),按行写入(合并访存) __global__ voidtransposeReadColWriteRow(constfloat* restrict A, float* restrict B, int N){ int x = blockIdx.x * blockDim.x + threadIdx.x; int y = blockIdx.y * blockDim.y + threadIdx.y; if (x < N && y < N) { // 读取 A: 相邻线程的 x 连续递增,物理地址间隔 N -> 跨步读取 // 写入 B: 相邻线程的 x 连续递增,物理地址连续 -> 合并写入 B[y * N + x] = A[x * N + y]; } }
说些什么吧!