上期内容:核函数
写在前面
因为疫情原因拖更了很久,本想回到学校后继续用学校的服务器做实验,结果碰上服务器维护,所以本期实验使用的GPU为PC端显卡。本期文章将讨论如何实现CUDA版的向量加程序——一种在数值应用中常见的计算场景,并与CPU版程序进行比较。
本来还想在本期文章中加入矩阵乘的实现,但后来感觉矩阵乘和向量加有很多重复的内容,那就不增加文章的篇幅了。
实验用完整代码可见我的GitHub:https://github.com/BenQuickDeNN/CUDA_tutorial/tree/master/vadd
实现向量加
一般情况下,数值计算应用场景下的向量加形式化定义为:
其中,c、a、b皆为向量,alpha和beta为标量。
向量加程序是非常典型的一维批量数据运算,其在一般编程情景中的示例代码如下:
for (int i = 0; i < LEN; i++)
c[i] = alpha * a[i] + beta * b[i];
现在我们要把类似的功能搬到GPU上。
1 编写核函数
核函数用于封装程序的热点。我们希望调用一个一维Grid和若干个一维Block来并行处理向量加计算,每个线程处理其中的一批(batch)加法运算。需要注意:
- 核函数不能返回任何值,所以参数中应包括用于存储结果的数组,通过参数传回计算结果。
- 因为Grid和Block都是一维的,所以计算线程号的过程可以大大简化。
核函数示例代码如下:
/*********************************************************************
* @file cuda_vadd_kernel.cu
* @brief kernel source of vector add
* @author Bin Qu
* @email benquickdenn@foxmail.com
* you can reedit or modify this file
*********************************************************************/
#ifndef CUDA_VADD_KERNEL_H
#define CUDA_VADD_KERNEL_H
#include "confi