2.3 A VECTOR ADDITION KERNEL

news2024/9/28 15:28:10

我们现在使用矢量加法来说明CUDA C程序结构。矢量加法可以说是最简单的数据并行计算,是顺序编程中Hello World的并行等价物。在我们展示向量加法的内核代码之前,首先回顾传统的向量加法(主机代码)函数的工作原理是有帮助的。图2.5显示了一个简单的传统C程序,它由主函数和向量加法函数组成。在我们所有的示例中,每当需要区分主机和设备数据时,我们都会在主机处理的变量名称前加上“h_”和由设备处理的变量名称“d_”,以提醒自己这些变量的预期用途。因为我们只有图2.5中的主机代码,我们只看到“h_”变量。
在这里插入图片描述
假设要添加的向量存储在主程序中分配和初始化的数组A和B中。输出向量在数组C中,该数组也在主程序中分配。为了简洁起见,我们没有显示A、B和C如何在主函数中分配或初始化的详细信息。这些数组的指针(见下面的边栏)与包含向量长度的变量N一起传递给vecAdd函数。请注意,vectorAdd函数的正式参数以“h_”为前缀,以强调这些参数由主机处理。当我们在接下来的步骤中引入设备代码时,这个命名惯例将有所帮助。

图2.5中的vecAdd函数使用for-loop来遍默向量元素。在第i次迭代中,输出元素h_C[i]接收h_A[i]和h_B[ij的总和。向量长度参数n用于控制循环,以便迭代次数与向量的长度相匹配。形式参数h_A、h_B和h_C是通过引用传递的,因此函数读取h_A、h_B的元素,并通过参数指针A、B和C写入h_C的元素。当vecAdd函数返回,主函数中的后续语句可以访问C的新内容。

并行执行向量加法的一个简单方法是修改vec-Add函数并将其计算移动到设备。这种修改后的vecAdd函数的结构如图2.6所示。在文件的开头,我们需要添加一个C预处理器指令来包含cuda.h头文件。该文件定义了我们即将推出的CUDA API功能和内置变量(见下面的边栏)。该函数的第1部分在设备(GPU)内存中分配空间来保存A、B和C矢量的副本,并将矢量从主机内存复制到设备内存。第2部分在设备上启动实际矢量加法内核的并行执行。第3部分将总和向量C从设备内存复制回主机内存,并释放设备内存中的向量。
在这里插入图片描述

C语言中的指针
图2.4中的函数参数A、B和C是指针。在C语言中,指针可用于访问变量和数据结构。虽然发点变量V可以用以下内容声明:
float V;
指针变量P可以用以下项声明:
float *P;
通过用语句P=&V将V的地址分配给P,我们使P“指向”V。*P成为V的同义词。例如,U=*P将V的值分配给U。另一个例子,*P=3将V的值更改为3。
C程序中的数组可以通过指向其Oth元素的指针访问。例如,语句P=&(A[0])使P指向数组A的Oth元素。P[i]成为A[il的同义词。事实上,数组名称A本身就是指向其Oth元素的指针。
在图2.5中,传递数组名称A作为函数调用vecAdd的第一个参数,使函数的第一个参数h_A指向A的第0个元素。我们说A是通过引用vecAdd传递的。因此,函数主体中的h_A[i]可用于访问A[i]。
有关指针在C中的详细用法的易于遵循的解释,请参阅Patt&Patel [Patt]。

请注意,修订后的vecAdd函数本质上是一个外包代理,将输入数据传输到设备,激活设备上的计算,并从设备收集结果。代理这样做的方式是,主程序甚至不需要意识到矢量加法现在实际上是在设备上完成的。在实践中,由于所有数据的来回复制,这种“透明”的外包模式可能效率非常低。人们通常会在设备上保留重要的批量数据结构,并简单地从主机代码中在其上唤起设备功能。目前,我们将使用简化的透明模型,以引入基本的CUDA C程序结构。修订后的函数的细节,以及编写内核函数的方法,将在本章的其余部分中展示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1363754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务,它能够帮助用户快速搭建网站、应用和服务&…

专栏序言-GDB高级调试技巧实战

工欲善其事必先利其器! GDB耍的溜,BUG找的快! 在软件开发的世界里,调试是不可避免的。对于C/C开发者来说,GDB就是那把调试利器!如果你只知道单步调试,那定位问题的速度肯定是龟速&#xff1b…

FSMC—扩展外部SRAM

一、SRAM控制原理 STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F103ZE系列芯片可以扩展外部SRAM用作内存。 给STM32芯片扩展内存与给…

Arduion Modbus通讯示例

实现了Arduion和Qt上位机利用Modbus协议采集DHT11数据&#xff0c;以及开关LED灯 软件界面&#xff1a; 实物界面&#xff1a; arduion下位机代码&#xff1a; #include <ModbusRtu.h> #include <DHT.h>#define DHTPIN 2 // DHT11连接到Arduino的数字引…

强化学习5——动态规划在强化学习中的应用

动态规划在强化学习中的应用 基于动态规划的算法优良 &#xff1a;策略迭代和价值迭代。 策略迭代分为策略评估和策略提升&#xff0c;使用贝尔曼期望方程得到一个策略的状态价值函数&#xff1b;价值迭代直接使用贝尔曼最优方程进行动态规划&#xff0c;得到最终的最优状态价…

【设计模式】迭代器模式

一起学习设计模式 目录 前言 一、概述 二、结构 三、案例实现 四、优缺点 五、使用场景 六、JDK源码解析 总结 前言 【设计模式】迭代器模式——行为型模式。 一、概述 定义&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象…

前端-基础 常用标签-超链接标签( 锚点链接 )

锚点链接 &#xff1a; 点击链接&#xff0c;可以快速定位到 页面中的某个位置 如果不好理解&#xff0c;讲一个例子&#xff0c;您就马上明白了 >>> 这个是 刘德华的百度百科 &#xff0c;可以看到&#xff0c;页面里面有很多内容&#xff0c;那就得有个目录了 …

贝锐蒲公英云智慧组网解读:实现工业设备远程调试、异地PLC互联

这个时候&#xff0c;使用异地组网是非常有效的解决方案。在12月28日贝锐官方的直播中&#xff0c;请到了贝锐蒲公英的技术研发经理&#xff0c;为大家分享了贝锐蒲公英云智慧组网解决方案&#xff0c;以及蒲公英二层组网相关的技术和应用。 搜索“贝锐”官方视频号&#xff0c…

C动态内存分配(被调函数内部指针内存分配)

void *malloc(size_t size); void free(void *); malloc在内存的动态存储区中分配一块长度为size字节的连续存储空间返回该区域的首地址与c中的内存分配new和delete作用相同&#xff08;但c的可适用范围更广&#xff09; 当在栈区&#xff0c;被调函数之外需要使用被调函数内部…

python自动化测试面试题与答案汇总

对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范…

程序语言相关知识——偏向Eigen矩阵

1 查看 Eigen库表示的矩阵 方法 1.1 列矩阵x在监视中&#xff0c;这样查看&#xff0c;数值右侧的圈圈 可用于更新数值 随程序 1.2 比较全的方法&#xff1a;来自于知乎&#xff1a;https://zhuanlan.zhihu.com/p/625334009?utm_id0 1.3 eigen的用法&#xff1a;https://ww…

[JavaWeb玩耍日记]JDBC(不常用)

项目结构 目录 一.快速入门 二.开启事务 三.sql执行对象的executeUpdate方法 四.查询数据库 五.SQL注入案例 六.使用PreparedStatement防止Sql注入 七.数据库连接池 一.快速入门 创建新项目&#xff0c;导入mysql-connector-java-5.1.48的jar包1.使用JDBC更新一条数据有…

缘分的计算

题目描述&#xff1a; 缘分是一个外国人难以理解的中文名词。大致说来&#xff0c;缘分是一种冥冥中将两人&#xff08;通常是情人&#xff09;结合的力量。仅管这是种迷信&#xff0c;很多人——特别是女生——喜欢去计算它。 不幸的是&#xff0c;644 也是这样。有天&#x…

其他排序(基数排序,希尔排序和桶排序)(数据结构课设篇3,python版)(排序综合)

本篇博客主要详细讲解一下其他排序&#xff08;基数排序&#xff0c;希尔排序和桶排序&#xff09;也是排序综合系列里最后一篇博客。第一篇博客讲解的是LowB三人组&#xff08;冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff09;&#xff08;数据结构课设篇1&…

11.3编写Linux串口驱动

编写串口驱动主要步骤 构建并初始化 struct console 对象&#xff0c;若串口无需支持 console 可省略此步骤 //UART驱动的console static struct uart_driver virt_uart_drv; static struct console virt_uart_console {//console 的名称&#xff0c;配合index字段使用&…

胡圆圆的暑期实习经验分享

背景 实验室一般是在研究生二年级的时候会放实习&#xff0c;在以后的日子就是自己完成毕业工作要求&#xff0c;基本上不再涉及实验室的活了&#xff0c;目前是一月份也是开始准备暑期实习的好时间。实验室每年这个时候都会有学长学姐组织暑期实习经验分享&#xff0c;本着不…

SpringBoot基于哨兵模式的Redis(7.2)集群实现读写分离

文章目录 一、前提条件二、SpringBoot访问Redis集群1. 引入依赖2. yaml配置3. 设置读写分离4. 简单的controller 三、运行四、测试1. 写2. 读3. 额外测试 环境 docker desktop for windows 4.23.0redis 7.2Idea 一、前提条件 先根据以下文章搭建一个Redis集群 Docker-Compo…

如何利用ssh将手机连接电脑

首先我们需要下载ssh&#xff0c;因为我们没有安装 sshd 命令意思是开启ssh 下载完以后要设置密码&#xff0c;我设置得是 123456 开启服务&#xff0c;查看ip 电脑连接 ssh 刚刚得ip -p 8022 后面就连接上了 我可以在这里启动我手机上的vnc

2024年汉字小达人区级选拔备考——选择题:选字填空

前面的几篇文章&#xff0c;六分成长介绍了汉字小达人区级选拔样题的前面三道题&#xff1a;看拼音写汉字、补充成语、诗词连线&#xff0c;这三道大题都是填空题&#xff0c;适合线下笔试&#xff0c;不太适合线上比赛。事实上&#xff0c;在区级自由比赛和市级比赛的时候&…

JVM是如何基于虚拟机栈运行的

众所周知&#xff1a;JVM执行Java代码是靠执行引擎实现的。执行引擎有两套解释器&#xff1a;字节码解释器、模板解释器。字节码解释器比较简单&#xff0c;不多说&#xff0c;看图。本篇文章咱们讨论模板解释器执行Java代码的底层原理。 早些年研究模板解释器看到R大用汇编写的…