CUDA调整指令级原语

在GPU上运行的运算密集型应用程序,处理器的计算吞吐量可以用它在一段时间内执行操作的数量来衡量。因为GPU有很多SIMT指令和计算核心,所以其峰值计算吞吐量通常比其他的处理器高。

对应用程序的吞吐量和正确性进行优化时,理解不同低级原语的性能、数值精确度和线程安全性方面的优缺点很重要。

CUDA指令

指令是处理器中的一个逻辑单元。需要了解CUDA内核代码什么时候会产生不同的指令以及高级语言如何转化为指令很重要。

浮点指令

IEEE-754标准定义了32位和64位浮点格式。标准规定将二进制浮点数编码成三段:符号段,1比特;指数段,多比特;以及尾数段,多比特。

然而浮点数的精度是有限的,举个栗子

a,b两个值都不能在float中精确的存储,都只能近似保存,这样两者恰好相等。

在浮点数值上进行操作的指令被称为浮点指令。CUDA支持所有在浮点数值上的常见数学运算。CUDA编程模式也遵守IEEE-754标准,支持两种精度的浮点数值。

内部函数和标准函数

CUDA将所有算数函数分成内部函数和标准函数。标准函数用于支持可对主机和设备进行访问并标准化主机和设备的操作。标准函数包含来自于C标准数学库的数学运算。

CUDA内置函数只能对设备代码进行访问。如果一个函数是内部函数或者是内置函数,那么在编译时对它的行为会有特殊响应,从而产生更积极的优化和更专业化的指令生成。这对CUDA内部函数来说是真实可信的。

在CUDA中,许多内部函数与标准函数是有关联的,意味着存在于内部函数功能相同的标准函数。内部函数分解成了比与它们等价的标准函数更少的指令。导致内部函数比等价的标准函数更快,但数值精度更低

原子操作指令

一条原子指令用来执行一个数学运算,此操作是一个独立不间断的操作,且没有其他线程的干扰。当一个线程在一个变量上成功完成一个原子操作,那么不管有多少线程正在访问这个变量,这个变量的状态都已经发生了改变。在GPU的高并发环境中,保证“读-改-写”操作的完整性非常重要。CUDA提供了在全局内存或共享内存上执行“读-改-写”操作的原子函数。

与标准函数和内部函数类似,每个原子函数可以实现一个基本数学运算。不同于其他类型指令的是,在原子操作指令中,当两个竞争线程共享的内存空间进行操作时,会有一个定义好的行为。

举个栗子

__global__ void incr(int *p){int temp = *p;temp = temp + 1;*p = temp;
}

如果运行这个核函数,在多线程并行环境中,结果是不确定的。不止一个线程对同一个内存位置进行写操作,叫做数据竞争,或者称为对内存的不安全访问。数据竞争是指,多个独立的正在执行的线程访问同一个地址,而且至少有一个访问会修改该地址。

使用原子操作指令可以避免这种情况的发生。原子操作是通过CUDA API访问的函数。例如,

int atomicAdd(int *M, int V);

M是进行原子操作的地址,v是要加上的值。该原子操作将V加到M地址的变量中,并且返回操作之前的值。

另一个函数

int atomicExch(int *m, int v);

无条件的用v替换m中的值,并且返回原先存在m中的值。

程序优化指令

单精度与双精度比较

单精度与双精度浮点运算在通信和计算上的性能差异是不可忽略的。

单精度相较于双精度浮点运算计算和传输更快,但是精度更低。这些结果可能在迭代过程中被不断积累。

标准函数与内部函数比较

使用nvcc的--ptx标志能够让编译器在并行线程执行和指令集架构中生成程序的中间表达式。生成的PTX文件类似汇编的形式,可以直观的了解内核的低级别执行路径。

另外可以用一些编译指令操纵编译器指令的生成。例如,--fmad=false(默认是true)会强制命令编译器禁用混合乘法与加法的优化。具体命令在《CUDA C编程权威指南》表7-3

了解原子指令

通过使用一个原子函数,每个由CUDA提供的原子函数可以重复被执行:原子级比较并交换符(CAS)运算符。

原子级CAS是一个重要的操作,将三个内容作为输入:内存地址、存储在此地址中的期望值,以及实际想要存储在此位置的新值,然后执行

  1. 读取目标地址并将该处地址的存储值与预期值比较
  2. 如果存储值与预期值相等,那么新值将存入目标位置
  3. 如果存储值与预期值不等,那么目标位置不会发生变化
  4. 不论发生什么情况,一个CAS操作总是返回目标地址中的值。

一个原子CAS操作意味着整个CAS进程是在没有其他任何线程干扰的情况下完成的。

详细解释一下atomicCAS设备函数

int atomicCAS(int *address, int compare, int val);

进行atomicCAS时,先比较address地址当前的值是否等于compare,如果相等,则把address地址中的值变成val,如果不等,就不变,无论如何都返回比较前address中的值。

通过atomicCAS可以定义自己的原子操作。

原子操作的成本

原子函数在一些应用中很有必要而且很有帮助,但可能要付出很高的性能代价。

主要原因是,如果有多个线程对同一地址进行原子操作,那么会产生类似线程冲突的情况。只有一个线程可以原子操作成功,其他线程必须循环等待。并且,一个原子操作就意味着一个全局的读取和写入。

限制原子操作的成本

可以在使用局部操作来增强全局原子操作。比如从同一个线程块中产生不同的中间结果,在最后进行原子操作写入全局内存。

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

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

相关文章

常见通信协议

1、串口:(串行异步全双工,先发低位) 因为是异步的,所以没有时钟线,因为是全双工,所以有两条数据传输线,实现数据的收发。 帧格式 起始位1位,数据位8位,校验…

go语言常用的内置数据类型别名byte, rune 和any, error接口 定义和使用说明

本文描述了go语言中常用的一些类型别名和接口的定义和使用说明, 最为常用的就是 byte, rune, Type, any 还有 error , 详情如下: 8位无符号整数,表示范围 0--127 type uint8 uint8 byte uint8的别名,用来表示8位无符号整数&am…

【教程】极简Python接入免费语音识别API

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 安装库: pip install SpeechRecognition 使用方法: import speech_recognition as srr sr.Recognizer() harvard sr…

LeetCode 面试经典150题 228.汇总区间

题目: 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区…

spring高级篇(九)

boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…

MySQL商城数据表(80-84)

80商品规格值表 DROP TABLE IF EXISTS niumo_spec_items; CREATE TABLE niumo_spec_items (itemId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL DEFAULT 0 COMMENT 店铺ID,catId int(11) NOT NULL DEFAULT 0 COMMENT 类型ID,goodsId int(11) NOT…

【Linux IO基础】缓冲区

概念 缓冲区的主要作用是提高效率 --- 提高使用者的效率,因为有缓冲区的存在,我们可以积累一部分再统一发送,提高发送的效率。 刷新方式 缓冲区因为能够暂存数据,必定要有一定的刷新方式: 一般策略: 无…

Flask应用的部署和使用,以照片分割为例。

任务是本地上传一张照片,在服务器端处理后,下载到本地。 服务器端已经封装好了相关的程序通过以下语句调用 from amg_test import main from test import test main() test() 首先要在虚拟环境中安装flask pip install Flask 文件组织架构 your_pro…

基于Spring Boot的民宿管理平台设计与实现

基于Spring Boot的民宿管理平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台首页功能界面图,在系统首页可以查看首页…

【软件开发规范篇】JAVA后端开发编程规范

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

BeanUtils.copyProperties作用

文章目录 一、作用二、举例(1)新建两个实体类(2)pom引入依赖(3)main方法测试(4)结果输出(5)结论 一、作用 用来做对象间的copy。 二、举例 (1&…

Ubuntu部署前后端分离项目(前端vue,后端jar包)

一. Vue部署 1. 服务器安装node.js 2. 安装nginx 3. 上传vue包 将打包后的vue静态资源包dist文件夹,上传到服务器指定目录,并给该目录赋予相应权限。 4. 配置nginx (1) 创建vue项目配置文件 sudo vim /etc/nginx/conf.d/your-vue-project.conf (2)…

视频号小店在行业内的门槛高不高?有门槛是好事还是坏事?

大家好,我是电商小V 现在伴随着时代的慢慢发展,很多人都是想找一个好一点的创业项目,现在找创业项目都是找一些稍微有门槛的项目,没有门槛的话,要不然刚开始去做,项目就泛滥了,项目的红利期直接…

【AI】深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺……

深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺…… 来自:Axelera AI 资深软件工程师 Matthew Barrett 原帖是linkedin帖子: https://linkedin.com/posts/matthew-barrett-a49929177_i-think-its-fair-to-say-that-ml-compilation-ac…

GPT带我学-设计模式12-状态模式

啥是状态模式 状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为。状态模式将对象的状态封装成不同的类,并使得对象在运行时可以动态地改变状态,从而改变对象的行为。状态模式的主要目的是促进代码的复用和灵活…

Terraform资源地址

在编码时有时会需要引用一些资源的输出属性或是一些模块的输出值,这都涉及到如何在代码中引用特定模块或是资源。另外在执行某些命令行操作时也需要显式指定一些目标资源,这时要掌握Terraform的资源路径规则。 一个资源地址是用以在一个庞大的基础设施中…

Python_4-远程连接Linux

文章目录 使用Python通过SSH自动化Linux主机管理代码执行ls结果:文件传输: 使用Python通过SSH自动化Linux主机管理 在系统管理与自动化运维中,SSH(Secure Shell)是一个常用的协议,用于安全地访问远程计算机…

FTP协议与工作原理

一、FTP协议 FTP(FileTransferProtocol)文件传输协议:用于Internet上的控制文件的双向传输,是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同…

富格林:累积经验阻挠黑幕之手

富格林认为,近年来现货黄金投资市场越发火热,许多投资新手纷纷涌入现货黄金市场中。不过,在这需要提醒大家的是要提防黑幕阻挠我们顺利盈利,选择正规可靠的平台进行开户,这样可以保证投资环境的安全稳定。下面富格林将…

水泥分类和使用方式 宁波水泥菱湖新阳水泥厂325鄞州东钱湖春晓咸祥海螺425水泥镇海骆驼庄市

水泥分类和使用方式 宁波水泥菱湖新阳水泥厂325鄞州东钱湖春晓咸祥海螺425水泥镇海骆驼庄市 水泥是一种重要的建筑材料,广泛应用于建筑、桥梁、隧道等各种土木工程项目中。根据不同的分类标准,水泥可以分为多种类型,每种类型的水泥都有其特定…