CUDA编程笔记(8)

news2024/11/16 15:48:37

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 原子函数
  • 完全在GPU中归约
  • 性能比较
  • 总结


前言

原子函数的合理使用

原子函数

    在cuda里,一个线程的原子操作可以在不受其他线程的任何操作的影响下完成对某个(全局或共享内存中)数据的一套“读-改-写”操作,该操作是不可分的。原子函数是对它的第一个参数指向的数据进行一次“读-改-写”的一类原子操作的函数,一气呵成,不可分割。
如:

T atomicAdd(T *address,T val)// 加法
T atomicSub(T *address,T val)// 减法
T atomicExch(T *address,T val)// 交换
T atomicMin(T *address,T val)// 最小值
T atomicMax(T *address,T val)// 最大值
T atomicInc(T *address,T val)// 自增
T atomicDec(T *address,T val)// 自减
T atomicAnd(T *address,T val)// 按位与
T atomicOr(T *address,T val)// 按位或
T atomicXor(T *address,T val)// 按位异或
T atomicCAS(T *address,T camepare,T val)// 比较-交换

    第一个参数是带累加变量的地址。第二个参数是累加的值val。该函数的作用是先将地址adress中的旧值old读出,计算old+val,然后将计算的值存入地址adress。

完全在GPU中归约

    在共享内存中的数组归约,没有在核函数里做全部的计算,后面线程块的求和是在主机上进行的。为了提升性能,将所有的计算在核函数里完成。有两种方法:
(1)利用另一个核函数将最后那部分在主机里的求和操作完成;
(2)在原来的核函数里利用原子函数代替在主机里的求和操作;
这里主要介绍第二种方法。
    在前面博客上讲的的全局和共享内存数组归约的计算中,最后的求和是将数据复制到全局内存d_y,然后在主机上操作:

    if (tid == 0)
    {
        d_y[bid] = s_y[0];
    }

如果不用原子函数,为了满足在核函数做最后的求和操作直接修改成

    if (tid == 0)
    {
    	// 求和
        d_y[0] += s_y[0];
    }

    这是不能实现的。因为d_y[0] += s_y[0] 这个操作可以分成两步。首先,从d_y[0]中取出数据与s_y[0]相加;然后将结果写入d_y[0]。因为线程执行的异步性,可能会发生一个线程还未将结果写入d_y[0]中,另一个线程就要读取d_y[0]的数据,这样就会发生冲突,导致错误的结果。如果一个线程的“读-写”操作一气呵成,不受其他线程干扰,那么这样的操作就可行。所以,利用原子函数是可以解决这个问题的。

    if (tid == 0)
    {
    	// 原子函数
        atomicAdd(d_y, s_y[0]);
    }

    根据前面提到的原子函数的性质,原子函数的操作在一个线程里执行计算是不会被其他线程所干扰的。第一个参数是一个指针变量,可以用数组名d_y也可以使用&d_y[0]。注意一个细节就是要用到d_y[0],所以在前面要记得初始化d_y[0]的值为0。

性能比较

在2080Ti上,使用单精度浮点和双精度浮点运算,使用原子函数进行数组归约和函数的的性能:
(1)单精度
在这里插入图片描述
相比前面在共享内存上计算的,提升了大约(4.45-1.85)2.60/4.45~58.4%,性能提升显著。
(2)双精度
在这里插入图片描述
相比前面在共享内存上计算的,提升了大约(7.50-3.4)4.1/7.5~54.7%,性能提升显著。

总结

cuda核函数中使用原子函数
参考:
如博客内容有侵权行为,可及时联系删除!
CUDA 编程:基础与实践
https://docs.nvidia.com/cuda/
https://docs.nvidia.com/cuda/cuda-runtime-api
https://github.com/brucefan1983/CUDA-Programming

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

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

相关文章

快!用Vim

文章目录简介基操移动删改查搜索替换多文件操作text object赋值粘贴macro补全配色自定义配置映射插件常用插件gopython浏览补全格式化gitTmuxneovim简介 在 Linux 平台使用 Vim 编辑器,成为NB Vimer安装 vim 就不介绍了 基操 三种模式 inserta: append i: inser…

ESP-C3入门6. 使用UART串口

ESP-C3入门6. 使用UART串口一、简介二、UART使用的一般步骤三、使用的API1. uart_config_t结构体和设置参数函数uart_param_config()2. 专用函数设置参数3. 设置通信管脚uart_set_pin()4. 安装驱动程序uart_driver_install()5. 运行UART通信 uart_write_bytes()和uart_read_byt…

Spring Batch 批处理-执行上下文

引言 接着上篇:Spring Batch 批处理-作业监听器,了解作业监听器后,本篇就来了解一下Spring Batch执行上下文,来看看Spring Batch 如何在作业与步骤间进行数据共享。 作业与步骤上下文 语文中有个词叫上下文,比如&am…

设置mysql远程链接

一、 进入mysql数据库 mysql -uroot –p密码 二、 创建用户进行远程链接 Mysql>grant all privileges on *.* to duan%identified by 111111 with grant option; ‘duan’:用户名 ‘%’:表示所有主机都可以登录,如果‘ip’表示该主机可…

[GXYCTF2019]luck_guy1题解

无论风暴把我带到什么样的岸边,我都将以主人的身份上岸。 ——贺拉斯 目录 1.查壳 2.静态分析 分析信息 猜测 3.wp 1.查壳 x86-64 拖入64位IDA 2.静态分析 找到main函数,按下F5反编译 int __cdecl main(int argc, const char **argv, const cha…

Python Windows Apache部署Django项目运行环境

目录 一、安装Apache服务器 1、在官网http://httpd.apache.org/download.cgi或网上搜索下载zip压缩包 2、Apache相关配置 3、创建Apache服务器 解决报错AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator? 4、启动ap…

【每周Java技术】2023.01.26 周四 到 01.29 周日

文章目录一、01.26 周四 大年初五1.1)Python的一道算法题目1.1.1) 题目1.1.2) 解答1.1.3) 知识点一、01.26 周四 大年初五 1.1)Python的一道算法题目 1.1.1) 题目 2437. 有效时间的数目 给你一个长度为 5 的字符串 time ,表示一个电子时钟…

产线工控设备安全经验分享

工控设备安全现状 工业控制系统是支撑国民经济的重要设施,是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域,支撑起国计民生的关键基础设施。 随着传统的工业转型,数字化、网络化和智能化的工…

机器学习算法竞赛实战--3,数据探索

数据挖掘是竞赛的核心模块之一,贯彻竞赛始终也是很多竞赛胜利的关键那么数据探索又是什么呢?可以解决哪些问题?首先应该明确3点,即如何确保自己准备好竞赛使用的算法模型如何为数据集选择最合适的算法如何定义可用于算法模型的特征…

安装DevStack稳定版本zed

STEP1: 创建stack用户(一定要!) sudo useradd -s /bin/bash -d /opt/stack -m stack sudo chmod x /opt/stack echo "stack ALL(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack sudo -u stack -i //用stack用户登陆 STEP2: git clone devsta…

SAP中物料价格改变导致的库存价值变动业务分析

基于审计的需求要看看物料在标准成本价格变更前后的库存成本变化情况。找了下资料,需要用到 CKMPCSEARCH这个事务,相当于是一个用于价格修改凭证查询的事务。但试了一下在本公司的系统中并没有从搜索到其菜单位置。 尝试直接输入Tcode后,是可…

CSRF 伪造跨域请求

文章目录一、什么是伪造跨域请求二、攻击方式三、防御措施1、检查Referer字段2、添加校验token一、什么是伪造跨域请求 伪造跨域请求(英语:Cross-site request forgery),通常缩写为 CSRF, 是一种挟制用户在当前已登录…

IntelliJ IDEA 2021.2(Community Edition)安装阿里编码规约插件,亲测有效

1.背景阿里巴巴java开发手册不断完善并出了很多版本到目前2023年1月截止,已经出了黄山版,在文章最后有参考资料可根据需要下载;随着企业对项目质量的要求,对开发代码也有了更高的要求和规范,借助阿里巴巴编码规约插件&…

redis geo 没有迁移手工插入数据

1、docker ps |grep redis2、docker exec -it qinghai-sc-xining-redis-single/eadd4cc4eefe bin\sh --进入redis容器[rootlocalhost ~]# [rootlocalhost ~]# [rootlocalhost ~]# [rootlocalhost ~]# docker ps|grep rediseadd4cc4eefe redis "docker-entrypoint.s…"…

python 气体扩散,在 Python中用数值模拟研究气体扩散

在 Python 中,可以使用数值模拟来研究气体扩散。 模拟气体扩散需要解决两个问题:流体动力学方程(如 Navier-Stokes 方程)和扩散方程。 文章目录Python 代码模拟气体扩散计算并显示气体浓度的均值和标准差研究气体扩展的高级方法Py…

Word控件Spire.Doc 【Table】教程(7): 如何在C#中用表格替换word文档中的文本

Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

【金三银四系列】之Java基础面试(2023版)

Java基础面试题 一: Java基础 1: 简单说说Java中对象如何拷贝? 一、浅拷贝clone()如果对象中的所有数据域都是数值或者基本类型,使用clone()即可满足需求,如:Person p new Person();Person…

30天自制操作系统(Mac版)读书笔记(day9)

day7和day8都是鼠标和32位的操作,看起来都是理论,先略过。 检测内存块数量 使用中断去检测内存,把这个当成一个函数调用吧。这里面di寄存器给的地址就是结果存在的内存位置。 ComputeMemory:mov ebx, 0mov di, MemChkBuf .loop:mov e…

linux安装vnc服务

1、 如操作系统是最小化安装,那么需要安装GNOME桌面,安装参考:https://blog.csdn.net/carefree2005/article/details/119417234 2、 安装vnc-server yum -y install tigervnc-server3、 复制配置文件模板,将无关的内容清除 cat…

图灵 | 计算机器与智能

【“计算机器与智能”选自《Mind》,no.2236(1950.10),P433-460。牛津大学出版社允许重印。刘西瑞、王汉琦 翻译】1. 模仿游戏我建议来考虑这个问题 :“机器能够思维吗?” 这可以从定义 “机 器” 和 “思维…