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.hqwc.cn/news/670319.html

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

相关文章

体育老师工资高吗,奖金有吗

教师的薪资水平与多种因素相关,包括教育经验、工作地点、学校类型以及个人的教学成果等。在讨论体育教师的工资问题时,不能仅仅关注数字,更应了解教育价值和个人发展。 初中体育教师的工资水平受多种因素影响。根据网络统计的数据&#xff0c…

SuperMap GIS基础产品FAQ集锦(20240429)

一、SuperMap iServer 问题1:咨询一下,正式许可插上后,出现这样的提示。可能是哪方面的原因呢? 11.1.1 【问题原因】虚拟机环境读取USB设别需要设置USB映射 【解决办法】虚拟平台重新进行USB映射操作后能正常读取许可 问题2&a…

[性能优化] ScrollView视图优化为循环列表

问题描述: 原先商城的物品栏中的item 是load在一个scrollView 下,用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件,随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

机器学习——2.损失函数loss

基本概念 损失函数也叫代价函数。损失函数就是计算预测结果和实际结果差距的函数,机器学习的过程就是试图将损失函数的值降到最小。 图左:|t_p - t_c| 图右:(t_p - t_c)**2 代码实…

LLM——用于微调预训练大型语言模型(LLM)的GPU内存优化与微调

前言 GPT-4、Bloom 和 LLaMA 等大型语言模型(LLM)通过扩展至数十亿参数,实现了卓越的性能。然而,这些模型因其庞大的内存需求,在部署进行推理或微调时面临挑战。这里将探讨关于内存的优化技术,旨在估计并优…

【Elasticsearch<四>✈️✈️】SpringBoot 项目整合 Elasticsearch

目录 🍸前言 🍻一、Elasticsearch 本地环境启动 🍺二、SpringBoot 项目整合 Elasticsearch 2.1 引入 ES 依赖 2.2 配置 ES 属性 2.3 创建实体类 2.4 操作 ES 的工具类 2.5 操作 ES 的业务层 🍹三、接口测试 3.1 编写测试类 3…

跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan

What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…

Mac跑llama.cpp过程中遇到的问题

原repo 在华为手机上安装termux、下载库:顺利在电脑上安装Android NDK:先下载Android Studio,再在里面下载Android SDK 安装Android Studio时,SDK的某些组件总是下载不成功。后来关了梯子、改了hosts,重新安装就成功了…

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳,今年4月才开门营业,但从开业到今天,刮刮乐总共就来了一回货——开业时发的20本。 那之后,刮刮乐就彻底断供了。原本,陆诗想把刮刮…

5G Advanced and Release18简述

5G Advanced 5G-Advanced, formally defined in 3GPP Release 18, represents an upgrade to existing 5G networks. 先睹robot总结的5G Advanced的advancements: Enhanced Mobility and Reliability: 5G-Advanced will support advanced applications with improved mobility…

客户管理软件排行榜:对比18款CRM

本文将对比18个客户管理软件:纷享销客、Zoho CRM、Salesforce、HubSpot CRM、Pipedrive、Freshsales、Microsoft Dynamics 365 CRM、Insightly CRM、Nimble CRM、Apptivo CRM、SugarCRM、白码CRM、简信CRM、销帮帮CRM、Teamface企典CRM、神州云动CRM、悟空CRM、八百…

The forms of the layered MVP in Acise

在Layered MVP架构,Model负责业务逻辑,View负责用户界面,Presenter处于Model与View之间,一方面将Model数据转换成界面数据,另一方面将用户界面输入投递到Model层。 一般地,Model数据显示涉及到对象树、视图…