NVIDIA CUDA 高度并行处理器编程(一):CUDA简介习题
1. 矩阵加法接受两个矩阵 B 和 C 产生输出矩阵 A。输出矩阵 A 的每个元素是输入矩阵 B 和 C 相应元素之和,即 A[i][j] = B[i][j] + C[i][j]。方便起见只考虑方阵,元素都是单精度浮点值。写一个矩阵加法 kernel 函数和一个 stub 函数,可以用如下 4 个参数调用:指向输出矩阵的指针、指向第一个输入矩阵的指针、指向第二个输入矩阵的指针和每个维度上的元素个数。根据如下说明编写:
- 主机存根函数为输入和输出矩阵分配内存、传输输入数据到设备上、启动 kernel 函数、将输出数据传输至主机以及回收为输入和输出矩阵分配的设备存储器。
int matrixAdd(float *A, float *B, float *C, int n){
int size = n *n * sizeof(float);
float *d_A, *d_B, *d_C;
cudaMalloc((void **)&d_A, size);
cudaMemcpy(d_A, A, size, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_B, size);
cudaMemcpy(d_B, B, size, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_C, size);
// matrixAddKernel1<<<ceil(n * n / 512.0), 512>>>(d_A, d_B, d_C, n);
// matrixAddKernelRow<<<ceil(n / 512.0), 512>>>(d_A, d_B, d_C, n);
// matrixAddKernelCol<<<ceil(n / 512.0), 512>>>(d_A, d_B, d_C, n);
cudaMemcpy(C, d_C, size, cudaMencpyDeviceToHost);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
}
- 编写 kernel 函数, 每个线程生成一个输出矩阵元素。并为此种方案填写执行配置参数。
//compute vector sum C = A + B
//Each thread performs one one pair-wise addition
__global__ void matrixAddKernel(float *A, float *B,