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.mfbz.cn/a/608053.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SOCKET编程(1):基本概念

基本概念 socket分类 socket提供了**流(stream)和数据报(datagram)**两种通信机制,即流socket和数据报socket 流socket基于TCP协议,是一个有序、可靠、双向字节流的通道,传输数据不会丢失、不会重复、顺序也不会错乱 数据报socket基于UDP…

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…

在Windows中创建和管理组策略管理模板的中央存储

本文参考于: 创建和管理中央存储 - Windows Client | Microsoft Learn 管理模板文件存储 Windows使用中央存储来存储管理模板,与组策略不同,ADM文件夹并不是通过组策略对象(GPO)来创建的。由于Windows版本与Windows…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具,用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成,准确率高达 98.8%。 不过该公司表示,这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

Java基于Spring Boot框架毕业生实习与就业管理系统的设计与实现(附源码,说明文档)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

vue+springboot实现excel批量数据的导入导出

①后端配置端口:修改UserController UserController: package com.example.springboot.controller;import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.…

IPFoxy Tips:什么是静态住宅IP?静态ISP代理指南

静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…

Pentaho Community Edition 下载安装和运行

1 访问网站 https://www.hitachivantara.com/pentaho/pentaho-plus-platform/data-integration-analytics/pentaho-community-edition.html ,点击 Download Now 。 2 选中,然后点击 Proceed to Download。 3 页面往下滑,选择合适的版本&…

关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors,之前的印象是错的,居然还拿来面试里讲,惭愧,这里暂时整理俩小问题,其他的后续可能会更新。。 线程池是创建的越大越好嘛 #线程池创建的越大越好吗 Tip:2024-04-10 更…

YOLOv5-7.0改进(三)添加损失函数EIoU、AlphaIoU、SIoU、WIoU、MPDIoU、NWD

前言 损失函数的改进一直是涨点的重要技巧,本篇博客将使用六个不同损失函数对算法进行改进,并绘制出改进结果对比图~ 往期回顾 YOLOv5-7.0改进(一)MobileNetv3替换主干网络 YOLOv5-7.0改进(二)BiFPN替换…

SRC上分秘诀+实战挖掘+挖洞技巧+新手上路+详细讲解

SRC马上到来 可能有些好兄弟们还没有头绪 只会做一些靶场 并没有什么实战经验 所以这篇文章给大家分享一下我挖洞2个月的经验分享 适合新手上路 如何找站? 谷歌搜索 谷歌搜索 谷歌搜索 SQL注入XSS所有漏洞 inurl:.php?idxx 公司inurl:.asp?idxx 公司inurl:.jsp?…

【每日刷题】Day35

【每日刷题】Day35 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 844. 比较含退格的字符串 - 力扣(LeetCode) 2. 2487. 从链表中移除节点 - 力…

C++:编程界的王者,引领未来的创新之路

在编程语言的浩瀚星空中,C犹如一颗耀眼的恒星,以其卓越的性能、深厚的底蕴和广泛的应用领域,持续引领着编程界的发展。它不仅在当下拥有无可替代的地位,更在未来展现出无限的潜力和可能性。 一、C:编程界的王者风范 …

[Linux深度学习笔记5.9]

5.9笔记 DNS: 软硬链接: 软链接: 软链接:ln -s /源文件 /目标位置/链接名称》创建软链接1.既可以对目录使用,也可以对文件使用2.删除源文件,软链接不可用3.软链接可以跨文件系统使用4.源文件和软链接的inode号不同5.…

【springboot基础】如何搭建一个web项目?

正在学习springboot,还是小白,今天分享一下如何搭建一个简单的springboot的web项目,只要写一个类就能实现最基础的前后端交互,实现web版helloworld ,哈哈,虽然十分简陋,但也希望对你理解web运作…

MGRE 实验

需求:1、R2为ISP,其上只能配置IP地址。 2、R1-R2之间为HDLC封装 3、R2-R3之间为ppp封装,pap认证,R2为主认证方。 4、R2-R4之间为ppp封装,chap认证,R2为主认证方。 5、R1、R2、R3构建MGRE环境&#xff0…

C++语言·string类

1. 为什么有string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数(strcpy,strcat),但是这些库函数与字符串是分离开的,不太符合OOP(Object Oriented Programming面向对…

ARM(4)缓存一致性

目录 一、缓存一致性问题 二、一致性实现方案 2.1 目录一致性协议 2.2 嗅探一致性协议 三、CHI协议 3.1 cache state 3.2 snoop维护一致性 四、其他一致性协议 4.1 MSI协议 4.2 MESI 协议 4.3 MOESI协议 本文介绍以下内容: 缓存一致性问题一致性实现方案…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd,zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis,首先要连接上 redis 服务器,推荐看通过 Jav…

景源畅信数字:抖音小店的入住门槛大不大?

近年来,随着短视频平台的崛起,抖音小店逐渐成为了众多商家和创业者关注的焦点。那么,抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单,只需按照官方指引完成…
最新文章