原文链接

  回想一下我们之前在设备上使用“kernelFunction<<<1,1>>>(..)”执行一个函数的代码,我在那里还曾说过后面会细说,本文就详细介绍一下参数N1,<<>>,这里就是并行魔法发生地。

  N1是我们想并行运行的块数,如果我们调用“kernelFunction<<<5,1>>>(..)”,这个函数将分成5个副本并行运行,每个副本称为一个块。

  接下来我们必须要做的事情是,使用一个索引让每个副本为解决方案的不同部分工作,如果所有线程做完全一样的事情,就没有必要并行计算了,幸运的是,CUDA内置了一个变量blockIdx可以用来跟踪每个块的运行。

  blockIdx是一个2D变量,包含x和y,你可以使用x或同时使用x和y,这取决于我们要解决什么问题,一个简单的例子是同时使用x和y处理2D图像,为x和y轴上的每个像素产生一个线程,你也可以只使用x,这里没有什么指导原则。

  现在,我们通过检查blockIdx.x知道线程运行的id,并且知道如何并行运行内核,让我们创建一个简单的例子吧。

  在这个例子中,我们将创建一个应用程序,完全以并行内核生成一个数组,这个数组将包含每个运行的线程的threadID,当线程结束后,我们使用printf将结果打印出来。

  实现内核

  我们从查看内核代码开始:

__global__ void generateArray( int *hostArray )
{
int ThreadIndex = blockIdx.x;
hostArray[ThreadIndex] = ThreadIndex;
}

  首先,我们按BLOCKS大小创建一个数组,在设备上未数组分配空间,并调用:

generateArray<<<BLOCKS,>>>( deviceArray );.

  这个函数将在BLOCKS并行内核中运行,在一个调用中创建好全部数组。

  这个操作完成后,我们将结果从设备拷贝到主机,并将它打印在屏幕上,释放数组,最后退出。

  整个应用程序的源代码如下:

 #include <stdio.h>
#define BLOCKS 25
__global__ void generateArray( int *hostArray )
{
int ThreadIndex = blockIdx.x;
hostArray[ThreadIndex] = ThreadIndex;
}
int main( void )
{
int hostArray[BLOCKS];
int *deviceArray;
cudaMalloc( (void**)&deviceArray, BLOCKS * sizeof(int) );
cudaMemcpy( deviceArray,
hostArray, BLOCKS * sizeof(int),
cudaMemcpyHostToDevice );
generateArray<<<BLOCKS,>>>( deviceArray );
cudaMemcpy( hostArray,
deviceArray,
BLOCKS * sizeof(int),
cudaMemcpyDeviceToHost );
for (int i=; i<BLOCKS; i++)
{
printf( “Thread ID running: %d\n”, hostArray[i] );
}
cudaFree( deviceArray );
return ;
}

  现在编译并运行这段代码,你将会看到像下面这样的输出:


程序运行输出结果

  恭喜,你已经使用CUDA成功创建了你的第一个并行应用程序!

GPU并行编程:内核及函数的实现的更多相关文章

  1. 五 浅谈CPU 并行编程和 GPU 并行编程的区别

    前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...

  2. 三 GPU 并行编程的运算架构

    前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流, ...

  3. 第三篇:GPU 并行编程的运算架构

    前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别? 本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流 ...

  4. 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别

    前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...

  5. 【并行计算-CUDA开发】GPU并行编程方法

    转载自:http://blog.sina.com.cn/s/blog_a43b3cf2010157ph.html 编写利用GPU加速的并行程序有多种方法,归纳起来有三种: 1.      利用现有的G ...

  6. 四 GPU 并行编程的存储系统架构

    前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...

  7. 第四篇:GPU 并行编程的存储系统架构

    前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...

  8. GPU并行编程小结

    http://peghoty.blog.163.com/blog/static/493464092013016113254852/ http://blog.csdn.net/augusdi/artic ...

  9. 六 GPU 并行优化的几种典型策略

    前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...

随机推荐

  1. 记录在APIO2019前

    2019-05-07 嗯, 只报名参加了APIO. 今天是五月七号,距离前往帝都参加我的退役之战, 还有八天(5.15) 然后没什么可说的, 就是记录一下这几天吧. 今天下午去学了虚树(其实没什么的) ...

  2. Java基础--常用API--java.lang.Object

    一.简述 1.Object类是所有类的父类,即直接或间接的继承java.lang.Object类.省略了extends Object. 2.方法 (1)protected native Object ...

  3. vue2格式化时间戳

    注意:时间戳分为10位和13位的,10位的是秒,13位的是毫秒 这里给出的是格式化13位的方法,10位的时间戳可以加上3个0 <div id="app">{{time ...

  4. python基本数据类型练习

    一.元素分类# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.# 即 ...

  5. LeetCode 208 Implement Trie (Prefix Tree) 字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods.Note:You may assume that all inputs are ...

  6. 016 3Sum Closest 最接近的三数之和

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  7. LeetCode 179 Largest Number 把数组排成最大的数

    Given a list of non negative integers, arrange them such that they form the largest number.For examp ...

  8. ZK配置文件

    The number of milliseconds of each tick, 最小时间单位,很多运行时的时间 #间隔都是使用tickTime的倍数来表示的,例如initLimit=10就是tick ...

  9. Mybatis与Ibatis的区别

    Mybatis与Ibatis的区别: 1.Mybatis实现了接口绑定,使用更加方便 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口 ...

  10. 用python计算直角三角形斜边长

    直接上代码 import math def hypotenuse(a,b): return(math.sqrt(a**2+b**2)) side1 = int(input("第一条直角边:& ...