美文网首页CUDA编程
1.3 CUDA编程模型之分配并行Thread

1.3 CUDA编程模型之分配并行Thread

作者: Catherin_gao | 来源:发表于2020-07-07 14:42 被阅读0次

    1. 如何用block和thread索引矩阵

    1.1 矩阵在全局内存 (global memory) 中通过行优先的方式线程存储。

    8*6的矩阵存储示意图

    1.2 如何使用block和thread索引从global memory访问分配的数据是GPU编程需要解决的第一个问题

    • 在矩阵加法内核中,通常为一个thread分配一个数据元素以进行处理。

    • 通常,需要管理三种索引:

      • Thread 和 block index
      • 矩阵中给定点的坐标
      • global memory的偏移量

    1.2.1 具体映射方法 (2D Grid and 2D Blocks)

    对于给定的线程,从block和thread索引中获取global memory中的偏移量。大概分为两步:

    (1) 将thread和block索引映射到矩阵中的坐标

    • 使用thread和block索引表示矩阵坐标:
    ix = threadIdx.x + blockIdx.x * blockDim.x 
    iy = threadIdx.y + blockIdx.y * blockDim.y
    

    (2) 将这些矩阵坐标映射到global memory的位置

    idx = iy * nx + ix
    
    映射示意图

    (3) 矩阵加法例子

    __global__ void sumMatrixOnGPU2D(float *MatA, float *MatB, float *MatC, int nx, int ny) {
        unsigned int ix = threadIdx.x + blockIdx.x * blockDim.x; 
        unsigned int iy = threadIdx.y + blockIdx.y * blockDim.y; 
        unsigned int idx = iy*nx + ix;
    
        if (ix < nx && iy < ny)
             MatC[idx] = MatA[idx] + MatB[idx];
    }
    

    2. 使用其他布局分配的矩阵加 (nx*ny) 学习如何使用GPU编程。

    2.1 1D block 和1D grid

    • 定义block和grid大小
      • 总共有nx个线程
    dim3 block(32,1);
    dim3 grid((nx+block.x-1)/block.x,1);
    
    • 数据分配:每个线程有ny个数据元素。


      Thread 和 block index 分配示意图
    • GPU kernel

    __global__ void sumMatrixOnGPU1D(float *MatA, float *MatB, float *MatC, int nx, int ny) {
        unsigned int ix = threadIdx.x + blockIdx.x * blockDim.x; 
        if (ix < nx ) {
            for (int iy=0; iy<ny; iy++) {
                int idx = iy*nx + ix;
                MatC[idx] = MatA[idx] + MatB[idx];
            }
         }
    }
    

    2.2 2D Grid and 1D Blocks

    • 定义block和grid大小
      • 总共有nx*ny个线程
    dim3 block(32);
    dim3 grid((nx + block.x - 1) / block.x, ny);
    
    • 数据分配:每个线程有1个数据元素。
      • 使用thread和block索引表示矩阵坐标:
    ix = threadIdx.x + blockIdx.x * blockDim.x; 
    iy = blockIdx.y;
    
    block index分配示意图
    • GPU kernel
    __global__ void sumMatrixOnGPUMix(float *MatA, float *MatB, float *MatC, int nx, int ny) {
        unsigned int ix = threadIdx.x + blockIdx.x * blockDim.x; 
        unsigned int iy = blockIdx.y;
        unsigned int idx = iy*nx + ix;
    
        if (ix < nx && iy < ny)
            MatC[idx] = MatA[idx] + MatB[idx];
    }
    

    相关文章

      网友评论

        本文标题:1.3 CUDA编程模型之分配并行Thread

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