首页 > 试题广场 >

请完成矩阵乘法的cuda实现,并进行优化。 答题说明:

[问答题]
请完成矩阵乘法的cuda实现,并进行优化。
答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
__global__ void shMatMul_Kernel(int matrixSize, float* matrixA, float* matrixB, float* matrixC,int TILE_WIDTH)
{
    extern __shared__ float sh_Mem[];
    float* sh_MatrixA = &(sh_Mem[0]);
    float* sh_MatrixB = &(sh_Mem[TILE_WIDTH*TILE_WIDTH]);

    int tx = threadIdx.x;
    int ty = threadIdx.y;
    int Col = blockIdx.x * TILE_WIDTH + tx;
    int Row = blockIdx.y * TILE_WIDTH + ty;
    int elementId = Row * matrixSize + Col;
    float Pvalue = 0;

    for (int m = 0; m < (matrixSize-1) / TILE_WIDTH + 1; m++)
    {
        sh_MatrixA[ty*TILE_WIDTH + tx] =  Row < matrixSize && m*TILE_WIDTH + tx < matrixSize ? matrixA[Row*matrixSize + (m*TILE_WIDTH + tx)] : 0;
        sh_MatrixB[ty*TILE_WIDTH + tx] = Col < matrixSize && m*TILE_WIDTH + ty < matrixSize  ? matrixB[(m*TILE_WIDTH + ty)*matrixSize + Col] : 0;
        __syncthreads();
        for (int k = 0; k < TILE_WIDTH; k++)
        {
            Pvalue += sh_MatrixA[ty*TILE_WIDTH + k] * sh_MatrixB[k*TILE_WIDTH + tx];
        }
        __syncthreads();
    }
    if (Row < matrixSize && Col < matrixSize)
    {
        matrixC[elementId] = Pvalue;
    }
    return;
}
发表于 2019-12-27 02:51:02 回复(0)