美文网首页
CUDA编程2——共享内存的优势

CUDA编程2——共享内存的优势

作者: 屡空 | 来源:发表于2020-09-01 11:45 被阅读0次

    这里解决一个问题。通过两个程序,讨论共享内存的优势。

    共享内存预计比全局内存快得多。它可以用作暂存器内存(或软件托管的高速缓存),以最大程度地减少来自CUDA块的全局内存访问.

    一 全局内存

    // Matrices are stored in row-major order:

    // M(row, col) = *(M.elements + row * M.width + col)

    typedef struct {

    int width;

    int height;

    float* elements;

    } Matrix;

    // Thread block size

    #define BLOCK_SIZE 16

    // Forward declaration of the matrix multiplication kernel

    __global__ void MatMulKernel(const Matrix, const Matrix, Matrix);

    // Matrix multiplication - Host code

    // Matrix dimensions are assumed to be multiples of BLOCK_SIZE

    void MatMul(const Matrix A, const Matrix B, Matrix C)

    {

    // Load A and B to device memory

    Matrix d_A;

    d_A.width = A.width; d_A.height = A.height;

    size_t size = A.width * A.height * sizeof(float);

    cudaMalloc(&d_A.elements, size);

    cudaMemcpy(d_A.elements, A.elements, size,

    cudaMemcpyHostToDevice);

    Matrix d_B;

    d_B.width = B.width; d_B.height = B.height;

    size = B.width * B.height * sizeof(float);

    cudaMalloc(&d_B.elements, size);

    cudaMemcpy(d_B.elements, B.elements, size,

    cudaMemcpyHostToDevice);

    // Allocate C in device memory

    Matrix d_C;

    d_C.width = C.width; d_C.height = C.height;

    size = C.width * C.height * sizeof(float);

    cudaMalloc(&d_C.elements, size);

    // Invoke kernel

    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);

    dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y);

    MatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C);

    // Read C from device memory

    cudaMemcpy(C.elements, d_C.elements, size,

    cudaMemcpyDeviceToHost);

    // Free device memory

    cudaFree(d_A.elements);

    cudaFree(d_B.elements);

    cudaFree(d_C.elements);

    }

    // Matrix multiplication kernel called by MatMul()

    __global__ void MatMulKernel(Matrix A, Matrix B, Matrix C)

    {

    // Each thread computes one element of C

    // by accumulating results into Cvalue

    float Cvalue = 0;

    int row = blockIdx.y * blockDim.y + threadIdx.y;

    int col = blockIdx.x * blockDim.x + threadIdx.x;

    for (int e = 0; e < A.width; ++e)

    Cvalue += A.elements[row * A.width + e]

    * B.elements[e * B.width + col];

    C.elements[row * C.width + col] = Cvalue;

    相关文章

      网友评论

          本文标题:CUDA编程2——共享内存的优势

          本文链接:https://www.haomeiwen.com/subject/xnnmsktx.html