CUDA基本语法

示例:向量加的CUDA实现

这里通过向量加计算这个例子介绍CUDA的基本知识,主要包括内存操作、核函数(kernel function)以及线程配置等。

向量加问题描述

向量abc为有N个元素的一维向量,计算c=a+b.
由于c中每个元素的计算与其他的元素间没有依赖关系,所以该问题适合于并行计算。见下图:

向量加操作示意图

CUDA是对现有编程语言的扩展,比如CUDA C是对C语言的扩展,大部分为C语言语法。下面我们分别来看下该问题的CPU代码实现以及CUDA代码实现,然后针对CUDA代码中新出现的语法作一一说明。

CPU 代码实现

CPU向量加的函数实现:

void vecAdd (int n, int *a, 
             int *b, int *c)
{
    for(int i = 0; i < n; i++)
    {
        c[i] = a[i] + b[i];
    }
} 

CPU代码的main函数:

void main(){
    int size = N * sizeof(int);
    int *a, *b, *c;
    a = (int *)malloc(size);
    b = (int *)malloc(size);
    c = (int *)malloc(size);
    memset(c, 0, size);
    init_rand_f(a, N);
    init_rand_f(b, N);

    vecAdd(N, a, b, c);
}

这一部分非常简单,没有需要解释的地方,下面我们来看一下CUDA代码的实现有什么不同之处。

CUDA代码实现

CUDA向量加的函数实现:

__global__ void
vectoradd (int *a, int *b, 
            int *c, int n)
{
    int i = blockDim.x * 
             blockIdx.x +
             threadIdx.x;

    if (i < n)
    {
        c[i] = a[i] + b[i];
    }
}

CUDA代码main函数实现:

int main(void) {
    size_t size = N * sizeof(int);
    int *h_a, *h_b; int *d_a, *d_b, *d_c;
    h_a = (int *)malloc(size);
    h_b = (int *)malloc(size);
    ...
    cudaMalloc((void **)&d_a, size);
    cudaMalloc((void **)&d_b, size);
    cudaMalloc((void **)&d_c, size);

    cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
    vectoradd<<<Grid, block>>>(d_a, d_b, d_c, N);
    cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);

    cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
    free(h_a); free(h_b);
    return 0;
}
代码对比与分析

对比CPU代码以及CUDA代码,可以发现两者的部分代码是相似的,并且实现流程一致。我们这里主要关心的是两者的不同之处:

  1. 向量加函数的实现处不同。CUDA代码实现中函数最前面多出一个标识符__global__,该标识符表明这段函数会在GPU端执行,我们通常称这样的函数为核函数(Kernel function)。在函数的内部int i = blockDim.x * blockIdx.x + threadIdx.x;表示的是在GPU上执行时的线程号。另外CPU代码使用for循环对向量中的每个元素依次进行操作,而在CUDA代码中则省去了该循环操作,取而代之的是所有的元素同时操作,每个CUDA线程对应一个向量元素,这也就是并行计算。
  2. 内存的分配与释放。观察两者main函数的实现,总共可以发现两处不同之处,一是内存的分配与释放,另外一个是向量加实现函数的调用。前面我们也提到CPU与GPU分别具有各自的内存系统,数据可以在CPU内存以及GPU内存之间传递,要想在GPU上进行计算,我们首先要把待处理的数据放到GPU端,GPU完成计算后再把结果拷贝回CPU端。GPU端内存的分配与释放分别有相应的CUDA Runtime API来完成。
  3. 实现函数的调用。与CPU代码的另外一个明显的不同就在于实现函数的调用方式不同。从CUDA代码可以看出,其调用方式为kernel_name<<<grid, block>>>(…),其中<<<grid, block>>>为线程的配置信息,它表示核函数在GPU上执行时会有多少线程。
    上面简要说明了CUDA代码相对于CPU代码的不同之处,后面将针对这几个部分作详细的说明。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 开篇一张图,后面听我编 1. 知识准备 1.1 中央处理器(CPU) 中央处理器(CPU,Central Proc...
    He_Yu阅读 46,992评论 7 115
  • CUDA从入门到精通(零):写在前面 本文原版链接: 在老板的要求下,本博主从2012年上高性能计算课程开始接触C...
    Pitfalls阅读 3,599评论 1 3
  • 1. CPU vs. GPU 1.1 四种计算机模型 GPU设计的初衷就是为了减轻CPU计算的负载,将一部分图形计...
    王侦阅读 20,771评论 3 20
  • 本篇文章作为学习CUDA官方文档的学习笔记。CUDA C Programming Guide 1. Program...
    凉凉zz阅读 3,113评论 0 1
  • 4月3日日精进: 【敬畏】-【体验】-【持续】-【交给】-【显现】 1、缺啥补啥,怕啥练啥 2、一切为我所用,所用...
    xiebo阅读 110评论 0 0