GPU并行编程:内核及函数的实现
回想一下我们之前在设备上使用“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并行编程:内核及函数的实现的更多相关文章
- 五 浅谈CPU 并行编程和 GPU 并行编程的区别
前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...
- 三 GPU 并行编程的运算架构
前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别?本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流, ...
- 第三篇:GPU 并行编程的运算架构
前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别? 本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流 ...
- 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别
前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...
- 【并行计算-CUDA开发】GPU并行编程方法
转载自:http://blog.sina.com.cn/s/blog_a43b3cf2010157ph.html 编写利用GPU加速的并行程序有多种方法,归纳起来有三种: 1. 利用现有的G ...
- 四 GPU 并行编程的存储系统架构
前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...
- 第四篇:GPU 并行编程的存储系统架构
前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...
- GPU并行编程小结
http://peghoty.blog.163.com/blog/static/493464092013016113254852/ http://blog.csdn.net/augusdi/artic ...
- 六 GPU 并行优化的几种典型策略
前言 如何对现有的程序进行并行优化,是 GPU 并行编程技术最为关注的实际问题.本文将提供几种优化的思路,为程序并行优化指明道路方向. 优化前准备 首先,要明确优化的目标 - 是要将程序提速 2 倍? ...
随机推荐
- unique within an element
从tomcat 6 升到 tomcat-7.0.12 jsp页面报: org.apache.jasper.JasperException: /XXX/XXX.jsp(59,55) Attribute ...
- Nacos深入浅出(九)
然而Nacos的发布操作并不是上面我们想的那样通过代理去实现,通过下面的代码我们分析下: public class NacosConfigurationPropertiesBindingPostPro ...
- 视图、存储函数、存储过程、触发器:MySQL系列之五
一.视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上存储于" ...
- [HNOI2011]数学作业 矩阵快速幂 BZOJ 2326
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NNN 和 MMM ,要求计算Concatenate(1..N) Concatenate (1 .. N) ...
- oracle基本命令
1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password: 新用户的密码也可以不创建新 ...
- UnityError 动画系统中anystate跳转重复播放当前动画解决方案
- 如何去除Discuz标题栏中的Powered by Discuz!
今天修改discuz代码遇到一个问题,就是标题栏中的Powered by Discuz!,很不美观.查资料后得到了解决方法!介绍给大家. 那么如何去掉标题里面的Powered by Discuz!呢? ...
- SpringBoot | 第二十三章:日志管理之整合篇
前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...
- 小程序的switch组件
小程序的switch开关组件,总结下大概有三种使用场景. 其一: 纯展示场景, 用来展示某个开关值是打开还是关闭的,这个场景比较简单,给个disabled属性就ok了: 其二: 用户点击后立即切换开关 ...
- spring双列
public class MyCollection { private String[]array; private List<String>list; priv ...