Matrix 使用多列的CUDA矩阵乘法

Matrix 使用多列的CUDA矩阵乘法,matrix,cuda,matrix-multiplication,Matrix,Cuda,Matrix Multiplication,下面的代码计算C=A*B,如何将其展开以进行多平铺乘法?在每个循环中,A的一行与B的一列相乘。我的问题是如何修改它,使A的一行与B的多列相乘,从而避免为同一行重新加载它们 (代码取自:) //CUDA内核 __全局无效矩阵MUL(浮点*C、浮点*A、浮点*B、整数wA、整数wB、大小块大小) { int bx=blockIdx.x; int by=blockIdx.y; int tx=线程idx.x; int ty=threadIdx.y; int aBegin=wA*块大小*by; int a

下面的代码计算C=A*B,如何将其展开以进行多平铺乘法?在每个循环中,A的一行与B的一列相乘。我的问题是如何修改它,使A的一行与B的多列相乘,从而避免为同一行重新加载它们

(代码取自:)

//CUDA内核
__全局无效矩阵MUL(浮点*C、浮点*A、浮点*B、整数wA、整数wB、大小块大小)
{
int bx=blockIdx.x;
int by=blockIdx.y;
int tx=线程idx.x;
int ty=threadIdx.y;
int aBegin=wA*块大小*by;
int aEnd=aBegin+wA-1;
int aStep=块大小;
int bBegin=块大小*bx;
int bStep=块大小*wB;
浮点数Csub=0;

对于(int a=aBegin,b=bBegin;a,Kirk和Hwu的一本书深入探讨了如何开发高效的矩阵乘法内核:

在此之前,关于CUDA上的平铺矩阵乘法,在堆栈溢出方面也存在一些问题。请参阅以下内容:


Kirk和Hwu的一本书深入探讨了如何开发高效的矩阵乘法内核:

在此之前,关于CUDA上的平铺矩阵乘法,在堆栈溢出方面也存在一些问题。请参阅以下内容:


我不推荐这本书。虽然它在2010年可能很好,但大部分信息现在已经过时或完全错误。它已经过时,但设计模式仍然非常相关。我不推荐这本书。虽然它在2010年可能很好,但大部分信息现在已经过时或完全错误。它已经过时,但设计模式仍然非常相关。你能编辑你的问题来解释你想做什么以及为什么吗?除了一些(非常糟糕的)之外,你没有付出太多您没有编写的代码,以及您似乎希望其他人对其进行的某些更改的模糊描述……这个问题由Brendan Wood链接,似乎进行了阻止矩阵乘法。@Vanwaril:这实际上就是复制/粘贴到这个问题中的相同代码。talonmies:不知道这是“非常糟糕的”代码。我不是要你给我写代码,我是在问我该怎么做。重新表述这个问题。@JohnSmith:看起来你可能误解了这个代码的工作原理-如果我理解了你想问的,它已经做到了。你能编辑你的问题来解释你想做什么以及为什么吗?除了一些(非常糟糕)之外,你没有付出太多您没有编写的代码,以及您似乎希望其他人对其进行的某些更改的模糊描述……这个问题由Brendan Wood链接,似乎进行了阻止矩阵乘法。@Vanwaril:这实际上就是复制/粘贴到这个问题中的相同代码。talonmies:不知道这是“非常糟糕的”代码。我不是要你给我写代码,我是在问我该怎么做。重新措辞这个问题。@JohnSmith:看来你可能误解了代码的工作原理-如果我理解了你想问的,它已经做到了。
// CUDA Kernel
__global__ void matrixMul( float* C, float* A, float* B, int wA, int wB,size_t block_size)
 {
int bx = blockIdx.x;
int by = blockIdx.y;
int tx = threadIdx.x;
int ty = threadIdx.y;

int aBegin = wA * block_size * by;
int aEnd   = aBegin + wA - 1;
int aStep  = block_size;

int bBegin = block_size * bx;

int bStep  = block_size * wB;
float Csub=0;

for (int a = aBegin, b = bBegin; a <= aEnd; a += aStep, b += bStep) 
{
    extern __shared__ float As[];
    extern __shared__ float Bs[];
    extern __shared__ float smem[];

    smem[ty*block_size+tx] = A[a + wA * ty + tx];

    smem[block_size*block_size+ty*block_size+tx]  = B[b + wB * ty + tx];

    __syncthreads();

    for (int k = 0; k < block_size; ++k)
        Csub += smem[ty*block_size+k] * smem[block_size*block_size+k*block_size+tx] ;

    __syncthreads();
}

int c = wB * block_size * by + block_size * bx;
C[c + wB * ty + tx] = Csub;
}