如何使用CUDA实现矩阵乘法?

Number of views 84

请提供一个使用CUDA加速矩阵乘法的完整实现,并说明其性能优势。

1 Answers

在CUDA中实现矩阵乘法可以通过将计算任务分配给GPU上的多个线程来加速。以下是一个简单的CUDA C++示例,用于实现两个矩阵的乘法。

首先,请确保已经安装了CUDA工具包并设置好环境变量。接下来,创建一个新的C++文件(例如:matrixMul.cu),然后粘贴以下代码:

#include <cuda_runtime.h>
#include <iostream>

#define N 1024

// CUDA kernel to multiply two matrices
__global__ void matrixMulKernel(float *A, float *B, float *C, int N) {
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;

    if (row < N && col < N) {
        float value = 0.0f;
        for (int k = 0; k < N; ++k) {
            value += A[row * N + k] * B[k * N + col];
        }
        C[row * N + col] = value;
    }
}

int main() {
    // Allocate host memory
    float *h_A = new float[N * N];
    float *h_B = new float[N * N];
    float *h_C = new float[N * N];

    // Initialize matrices
    for (int i = 0; i < N * N; ++i) {
        h_A[i] = static_cast<float>(rand()) / RAND_MAX;
        h_B[i] = static_cast<float>(rand()) / RAND_MAX;
    }

    // Allocate device memory
    float *d_A, *d_B, *d_C;
    cudaMalloc(&d_A, N * N * sizeof(float));
    cudaMalloc(&d_B, N * N * sizeof(float));
    cudaMalloc(&d_C, N * N * sizeof(float));

    // Copy data from host to device
    cudaMemcpy(d_A, h_A, N * N * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, N * N * sizeof(float), cudaMemcpyHostToDevice);

    // Define block and grid size
    dim3 blockSize(16, 16);
    dim3 gridSize((N + blockSize.x - 1) / blockSize.x, (N + blockSize.y - 1) / blockSize.y);

    // Launch the kernel
    matrixMulKernel<<<gridSize, blockSize>>>(d_A, d_B, d_C, N);

    // Copy result back to host
    cudaMemcpy(h_C, d_C, N * N * sizeof(float), cudaMemcpyDeviceToHost);

    // Free device memory
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    // Free host memory
    delete[] h_A;
    delete[] h_B;
    delete[] h_C;

    return 0;
}

这个程序首先初始化两个大小为NxN的随机矩阵(A和B)。然后,它在GPU上为这些矩阵分配内存,并将数据从主机复制到设备。接下来,定义块大小(blockSize)和网格大小(gridSize),以确定每个线程处理的数据量。最后,调用matrixMulKernel函数执行矩阵乘法,然后将结果从设备复制回主机。

为了编译和运行此程序,可以使用以下命令:

nvcc -o matrixMul matrixMul.cu
./matrixMul

性能优势: CUDA矩阵乘法的性能优势主要在于并行计算。GPU通常具有数千个核心,可以同时处理大量计算任务。相比之下,CPU通常只有几个核心,因此无法高效地处理这种密集型计算。此外,现代GPU还具有高速缓存和内存带宽,这使得它们能够更快速地访问和处理数据。因此,在适当的问题规模下,CUDA矩阵乘法可以显著提高计算速度。