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 倍? ...
随机推荐
- JS事件之鼠标悬浮窗(鼠标悬浮窗抖动问题的解决)
鼠标进入显示悬浮窗,思路有简单有困难. 首先要注意的是我们要给悬浮窗设置position为absolute,不然我们改了 style.left style.top发现没有变化很尴尬.其余的内容看起来就 ...
- 平衡树合集(Treap,Splay,替罪羊,FHQ Treap)
今天翻了翻其他大佬的博客,发现自己有些...颓废... 有必要洗心革面,好好学习 序:正常的BST有可能退化,成为链,大大降低效率,所以有很多方法来保持左右size的平衡,本文将简单介绍Treap,S ...
- 73th LeetCode Weekly Contest Custom Sort String
S and T are strings composed of lowercase letters. In S, no letter occurs more than once. S was sort ...
- KMP 串的模式匹配 (25 分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...
- spring boot中ConditionalOnClass为什么没有classNotFound类加载异常
查看原码时有很多飘红的地方, 这些import都失败的地方, 为什么在运行时没有报错? 首先这些@Configuration类没有被程序中的类引用到 其次即使引用到这个类,不一定引用到类中的具体某个方 ...
- aspnetcore配置log4net并添加全局异常处理
第一步:在NuGet中引用log4net 第二步:创建log4net.config <?xml version="1.0" encoding="utf-8" ...
- Python时间与日期操作(datetime、time、calendar)
相关模块 模块 说明 time time是一个仅包含与日期和时间相关的函数和常量的模块,在本模块中定义了C/C++编写的几个类.例如,struct_time类 datetime datetime是一个 ...
- JavaScript 浮点数处理
众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...
- collectd 与 logstash配置
节点 node1: 配置logstash node2: 配置collectd, collectd收集本地的信息, 通过配置将信息发送到node1节点 node1安装配置logstash rpm -iv ...
- sublime格式化HTML+CSS插件--HTML-CSS-JS Prettify
介绍 在工作中经常会下载不同项目的源码,可能是压缩的原因,其中一些代码的格式十分的乱,这样就会导致阅读起来十分的不方便,所以下面介绍一个sublime的插件:HTML-CSS-JS Prettify ...