【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(3展开转置)【补图】

CUDA C编程笔记

  • 第四章 全局内存
    • 4.4 核函数可达到的带宽
        • 4.4.2.3 展开转置【为每个线程分配更独立的任务】

待解决的问题:

第四章 全局内存

4.4 核函数可达到的带宽

4.4.2.3 展开转置【为每个线程分配更独立的任务】

展开:提高转置内存带宽的利用率,来隐藏延迟
展开的目的:为每个线程分配更独立的任务,最大化当前内存请求

  • 基于行+展开因子为4
    展开的意思:让一个线程处理4个元素,而不是1个元素;由于展开方向沿着行(x的方向),每个线程处理连续的4个元素

为什么输出矩阵下标里面要乘ny
关键点:
①unsigned int ix = blockIdx.x * blockDim.x4 + threadIdx.x;//这里乘4
每个线程要处理4个元素的数据,每个block也对应处理4个block的范围
②if(ix+3
blockDim.x < nx && iy < ny)
每个线程将处理4个元素,即当前ix,以及ix+blockDim.x,ix+2blockDim.x,ix+3blockDim.x的位置
③假设blockDim.x是B,那么每个block在x方向上的处理范围是blockIdx.x * B4到(blockIdx.x+1)B4
每个线程在block内的threadIdx.x是0到B-1
所以每个线程对应的全局ix是blockIdx.x
B*4 + threadIdx.x
处理ix、ix+B、ix+2B、ix+3B这四个位置的数据
在这里插入图片描述

//2.展开转置————基于行(展开因子为4)
__global__ void transposeUnroll4Row(float *out, float *in, const int nx, const int ny){
    unsigned int ix = blockIdx.x * blockDim.x*4 + threadIdx.x;//这里乘4
    unsigned int iy = blockIdx.y * blockDim.y + threadIdx.y;

    //新数组索引,分别用于输入行访问和输出列访问
    unsigned int ti = iy*nx + ix;//in输入矩阵行访问
    unsigned int to = ix*ny + iy;//out输出矩阵列访问

    if(ix+3*blockDim.x < nx && iy < ny){
        out[to] = in[ti];
        out[to + ny*blockDim.x] = in[ti+blockDim.x];//转置后相邻元素距离为ny,因此输出矩阵out要乘ny
        out[to + ny*2*blockDim.x] = in[ti+2*blockDim.x];
        out[to + ny*3*blockDim.x] = in[ti+3*blockDim.x];
    }
}

//2.展开转置————基于列(展开因子为4)
//只修改交换的下标即可
__global__ void transposeUnroll4Col(float *out, float *in, const int nx, const int ny){
    unsigned int ix = blockIdx.x * blockDim.x*4 + threadIdx.x;//还是x这里乘4
    unsigned int iy = blockIdx.y * blockDim.y + threadIdx.y;

    //新数组索引,分别用于输入行访问和输出列访问
    unsigned int ti = iy*nx + ix;//in输入矩阵行访问
    unsigned int to = ix*ny + iy;//out输出矩阵列访问

    if(ix+3*blockDim.x < nx && iy < ny){
        out[ti] = in[to];
        out[ti+blockDim.x] = in[to + ny*blockDim.x];//转置后相邻元素距离为ny,因此输出矩阵out要乘ny
        out[ti+2*blockDim.x] = in[to + ny*2*blockDim.x];
        out[ti+3*blockDim.x] = in[to + ny*3*blockDim.x];
    }
}

输出结果如下:基于行的展开4和基于列的展开4

~/cudaC/unit4$ ./4-6.1transposeNsys 4
./4-6.1transposeNsys starting transpose at device 0: NVIDIA GeForce RTX 3090 
 with matrix nx 2048 ny 2048 with kernel 4
warmup         elapsed 0.000560 sec
Unroll4Row        elapsed 0.000077 sec <<< grid (32,128) block (16,16)>>> effective bandwidth 435.719788 GB

~/cudaC/unit4$ ./4-6.1transposeNsys 5
./4-6.1transposeNsys starting transpose at device 0: NVIDIA GeForce RTX 3090 
 with matrix nx 2048 ny 2048 with kernel 5
warmup         elapsed 0.000564 sec
Unroll4Row        elapsed 0.000059 sec <<< grid (32,128) block (16,16)>>> effective bandwidth 569.787415 GB

查询可得,理论峰值带宽为936 GB/s
基于行的4级展开是理论峰值的47%
基于列的4级展开是理论峰值的61%

数据对比:
在这里插入图片描述

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

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

相关文章

后端重载和重写的区别

重载 相同的方法名&#xff0c;形参数量不同或者参数顺序不同或者参数类型不同称为方法重载 重写 方法名和形参列表相同 重写方法前提:必须存在继承关系 (1)方法重载是&#xff1a;一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法…

字节最新AI 版IDE:用Trae开发网站打包信息追踪插件,国产版Cursor表现如何?

文章首发地址&#xff1a;https://juejin.cn/post/7472684607365922850 插件背景及项目概述 在现代前端开发中&#xff0c;我们常常需要获取当前线上环境的代码构建信息&#xff0c;如项目打包人、打包时间、Git版本信息等。在持续集成/持续交付&#xff08;CI/CD&#xff09…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 1

第01章_Linux下MySQL的安装与使用 首先在vmware中下载centos7&#xff0c;实际上8更好一点&#xff0c;不过centos已经是时代的眼泪了&#xff0c;我之前已经教过了&#xff0c;不过是忘了&#xff0c;所以重新说一遍&#xff0c;看文档即可 2.开机前修改mac地址 &#xff0…

网络工程师 (47)QOS

一、概念与原理 QOS即服务质量&#xff08;Quality of Service&#xff09;是一种网络技术&#xff0c;用于管理和保证网络中不同类型的质量和性能。它通过设置优先级和带宽限制等策略&#xff0c;确保关键应用&#xff08;如视频会议、语音通信&#xff09;的数据包能够在网络…

什么是幂等性?

一.幂等性 什么是幂等性&#xff1f; 在计算机科学和数学领域中&#xff0c;” 幂等性 “虽然源于相同的概念&#xff0c;但其应用和具体含义有所不同 在数学中&#xff1a;幂等性是一个代数性质&#xff0c;描述的是一个操作或函数在多次应用后结果不变的特性 在分布式系统…

PyCharm Terminal 自动切换至虚拟环境

PyCharm 虚拟环境配置完毕后&#xff0c;打开终端&#xff0c;没有跟随虚拟环境切换&#xff0c;如图所示&#xff1a; 此时&#xff0c;需要手动将终端切换为 Command Prompt 模式 于是&#xff0c;自动切换至虚拟环境 每次手动切换&#xff0c;比较麻烦&#xff0c;可以单…

YOLOv12从入门到入土(含结构图)

论文链接&#xff1a;https://arxiv.org/abs/2502.12524 代码链接&#xff1a;https://github.com/sunsmarterjie/yolov12 文章摘要&#xff1a; 长期以来&#xff0c;增强YOLO框架的网络架构一直至关重要&#xff0c;但一直专注于基于cnn的改进&#xff0c;尽管注意力机制在建…

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…

解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱

一、引言 机器学习算法种类繁多&#xff0c;它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天&#xff0c;我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法&#xff08;K-Means Algorithm&#xff09…

Bigemap Pro如何设置经纬网出图网格设置

第一步&#xff1a;打开bigemap pro软件&#xff0c;单击顶部网格选项第二栏&#xff0c;弹出经纬网设置对话框&#xff0c;如下图&#xff1a; 按作图需求自定义设置后&#xff0c;点击应用如下图&#xff1a; 第二步&#xff1a;设置好经纬网之后&#xff0c;进行作图&#x…

K8s 之端口暴露(The Port of K8s is Exposed)

K8s 之端口暴露 Kubernetes 是一个用于管理容器化应用程序的流行工具。然而&#xff0c;关于它的工作原理存在一些误解。最常见的误解之一是关于 Kubernetes Pod 中的端口暴露。本文将解释 Kubernetes 中端口暴露的真相。 1 误解 像许多 Kubernetes 新手一样&#xff0c;我最…

操作系统2.4

一、死锁&#xff0c;饥饿&#xff0c;死循环 死锁&#xff1a;各进程互相等待对方手里的资源&#xff0c;导致各进程都阻塞&#xff0c;无法向前推进的现象 饥饿&#xff1a;由于长期得不到想要的资源&#xff0c;某进程无法向前推进的现象&#xff0c;例如&#xff1a;短进…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

c++进阶———继承

1.引言 在一些大的项目中&#xff0c;我们可能要重复定义一些类&#xff0c;但是很麻烦&#xff0c;应该怎么办呢&#xff1f;举个简单的例子&#xff0c;我要做一个全校师生统计表&#xff0c;统计学号&#xff0c;教师编号&#xff0c;姓名&#xff0c;年龄&#xff0c;电话…

Android 平台GB28181设备接入实战指南

一、引言 随着视频监控技术的不断发展&#xff0c;国标 GB28181 协议在安防监控领域得到了广泛应用。该协议为不同厂家的视频监控设备之间的互联互通提供了统一的规范&#xff0c;使得设备的接入与管理变得更加简单和高效。在 Android 平台上实现 GB28181 设备接入&#xff0c…

细说Java 引用(强、软、弱、虚)和 GC 流程(一)

一、引用概览 1.1 引用简介 JDK1.2中引入了 Reference 抽象类及其子类&#xff0c;来满足不同场景的 JVM 垃圾回收工作&#xff1a; SoftReference 内存不足&#xff0c;GC发生时&#xff0c;引用的对象&#xff08;没有强引用时&#xff09;会被清理&#xff1b;高速缓存使用…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

android ViewPager 管理 Fragment的预加载onCreate

一、前言 当ViewPager 加载多个 Fragment时候&#xff0c;怎么管理Fragment预加载。因为有些数据需要提前加载&#xff0c;第一个方便后面数据使用&#xff0c;提前初始化。或者预加载网络数据等。 二、实现示例 在onCreate方法进行数据预加载。如果在onCreateView函数里面&…

云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色

一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…

Redis常用命令合集【二】

在合集【一】中已经介绍了redis中String类型和Hash类型&#xff0c;接下来就继续介绍剩下的List、Set、SortedSet类型。 1.List类型 Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与…