CUDA编程:其四、CUDA矩阵乘法

一、c语言中矩阵的表示。

不同于C++,c语言对于矩阵的表示和一维数组没有区别。矩阵虽然是二维,但是在c语言内存空间里面仍然是线性存储,说白了先存第一行,再存第二行,以此类推。
假如一个二维数组int array[100][100],那么元素a[50][50]按照指针的取值方法就是

*(a+50*100+50)

二、矩阵乘法的线性代数基础

假如有两个矩阵A和B,那么A×B可以运算的前提是,A的列数等于B的行数,假设A×B=C,如果A的规格是m×k,B的规格是k×n,那么C的规格就是m×n。
在GPU之下,我们可以开辟m×n个线程,每个线程分别计算矩阵C中的一个元素。

三、线程的分配

前面博客提到,从逻辑层面,线程按照gird、block、thread方式组织。回到这个矩阵计算的场景,我们可以把线程想象成一个m×n的矩阵。所以gird中按照二维方式组织block,block中按照二维方式组织thread,所有线程就可以从逻辑上看作是一个矩阵了。并且有:

gridDim.x * blockDim.x >= n
gridDim.y * blockDim.y >= m

为什么要大于呢?因为线程的可以有空余的,但是不能存在不够用的情况。

四、核函数的编写

__global__ void matrixMulGlobalKernel(float* pfMatrixA, float* pfMatrixB, float* pfMatrixC, int m, int n, int k)
{
    int nRow = blockIdx.y * blockDim.y + threadIdx.y;
    int nCol = blockIdx.x * blockDim.x + threadIdx.x;
    float fCVal = 0.0f;

    for(int i =0; i < k; i++)
    {
        fCVal += pfMatrixA[nRow * k + i] * pfMatrixB[i * n + nCol];
    }

    pfMatrixC[nRow * n + nCol] = fCVal;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值