自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(5瘦块)

书上是Unroll4Col 效果最好。这里是NaiveCol 效果最好,有效带宽达到了峰值带宽的60%。目前最佳的块配置为(8,16),它和(16,16)的块并行性相同,但是由于它“瘦”导致了性能提升。进一步对基于列的朴素转置(case3)进行块大小实验。增加并行性最简单的方式是调整块的大小。

2025-02-20 11:44:54 119

原创 【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(4对角转置)

DRAM分区完成发送给全局内存的请求,设备内存中连续的256字节区域分配到连续的分区。使用直角坐标把线程块映射到——>数据块时,全局内存访问无法均匀分配到整个DRAM分区,发生“分区冲突”:内存请求在部分分区内排队等待,但另一部分分区一直空闲未被调用。当启用核函数时,线程块的ID决定分配给SM的顺序,如果所有SM都被占用,剩余的线程块等待有SM空余再分配。对角坐标映射造成了线程块——>数据块的非线性映射,交叉访问不太可能落到一个独立的分区,这导致速度提升。对角坐标————笛卡尔坐标(直角)的转换。

2025-02-19 22:35:20 232

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

③假设blockDim.x是B,那么每个block在x方向上的处理范围是blockIdx.x * B。每个线程将处理4个元素,即当前ix,以及ix+blockDim.x,ix+2。每个线程要处理4个元素的数据,每个block也对应处理4个block的范围。展开的目的:为每个线程分配更独立的任务,最大化当前内存请求。处理ix、ix+B、ix+2B、ix+3B这四个位置的数据。输出结果如下:基于行的展开4和基于列的展开4。基于行的4级展开是理论峰值的47%基于列的4级展开是理论峰值的61%

2025-02-19 17:22:27 318

原创 【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(2朴素转置)

缓存交叉读取能获得最高的加载吞吐量,一旦数据预先放到一级存储中,全局内存读取就有较好的隐藏延迟和较高的一级缓存命中率。猜测这种情况的结果是缓存中交叉存储导致,读入一级缓存的数据这次没有被访问到,但是以后的访问中可能命中。-Xptxas -dlcm=ca 启用一级缓存。-Xptxas -dlcm=cg 禁用一级缓存。一级缓存的加载可以限制交叉加载对性能的负面影响。基于行是理论峰值的46%(书上36%)基于列是理论峰值的59%(书上45%)输出结果如下:基于列 优于 基于行。

2025-02-18 18:07:43 102

原创 【CUDA 】第4章 全局内存——4.4 核函数可达到的带宽(1转置上下限)

读操作:按列读取不合并,带宽会被浪费在未被请求的字节上,这些额外的字节存入一级缓存,下次读操作可能直接从一级缓存中执行而不是全局内存上执行。本质:不好的访问模式,通过重新设计核函数的几个部分实现良好的性能,在次理想的情况下达到最理想的性能。①最大化并行执行隐藏内存延迟——>维持更多正在执行的内存访问达到更好的总线利用率。①两个一个数组矩阵:输入矩阵in和输出矩阵out,矩阵维度是nx行ny列。写操作:不在一级缓存上缓存,所以任何缓存都没有意义。核心代码:输出的列行位置的值=输入的行列位置的值。

2025-02-17 17:38:25 393

原创 【CUDA 】第4章 全局内存——4.3 内存访问模式(2)

待解决的问题:4-4.2readSegmentUnroll的性能并没有提升???

2025-01-20 16:31:46 745

原创 【CUDA 】第4章 全局内存——4.3 内存访问模式(1)

如下图所示,被引用的字节落在一个缓存行范围内,只需一个内存事务请求,但是总线利用率很低,假设加载的值为4字节,总线利用率=4/128=3.125%。如下图所示,warp中所有县城请求都在128字节内,完成加载只需一个128字节的事务,总线使用率100%,事务中数据都使用过。请求的128字节最多在落在N个32字节的内存分段内,而不是128字节的缓存行内,与请求缓存加载相比,非缓存加载会提升性能。如果一个warp中的每个线程请求4字节的值,每次请求正好获取128字节的数据,正好与缓存行和设备内存段大小契合。

2025-01-15 11:06:28 967

原创 【CUDA 】第4章 全局内存——4.2 内存管理

获取映射到固定内存的设备指针的函数:cudaError_t cudaHostGetDevicePointer(void **pDevice, void *pHost, unsigned int flags);当可分页主机向设备内存传输数据的时候:①cuda程序分配临时页面锁定的/固定的主机内存②把主机的源数据复制到固定内存③从固定内存传输数据给设备内存。在核函数中可以使用两种内存:①系统控制的托管内存(底层系统自动分配的统一内存,和特定设备的内存可以互相操作)②应用程序明确分配和调用的未托管内存。

2025-01-09 17:38:54 595

原创 【CUDA 】第4章 全局内存——4.1 CUDA内存模型概述

现代计算机的内存层次结构仅仅在支持局部性原则的情况下有效。CPU内存层次结构中,一级缓存L1和二级缓存L2都是不可编程处理器。CUDA内存模型提出了多种可编程类型,并且每种都有不同的作用域、生命周期和缓存行为。一个核函数kernel中的线程有自己私有的本地内存一个线程块block有自己的共享内存。对同一block内的线程都可见,持续block整个生命周期所有线程都能访问全局内存常量内存空间和纹理内存空间(为各种数据布局提供不同的寻址模式和滤波模式)

2025-01-07 15:31:24 837

原创 latex使用计算机学报修改论文

表格内容太多自动换行。

2025-01-07 09:54:50 283

原创 【CUDA 】第3章 CUDA执行模型——3.1概述+3.2线程束执行

核心:流式多处理器SM每个GPU有多个SM,每个SM支持数百个线程并行执行其中,共享内存和寄存器是非常重要的资源,共享内存分配在常驻block中,寄存器在thread中被分配,活跃的warp数量对应SM上的并行量当启动一个gird时,block被分配在SM上执行,多个block可以被分配到同一个SM,一个SM可以容纳多个block。

2024-11-14 10:24:21 1055

原创 【CUDA 】第2章 CUDA编程模型——2.4设备管理

待解决的问题:代码2-8中cudaDeviceProp类的成员变量缺少成员信息,与书本不一致报错。

2024-11-04 19:14:45 424

原创 【CUDA 】第2章 CUDA编程模型——2.3组织并行线程

给定线程——>线程和块索引——>线程和块索引的全局内存偏移量ix,iy——>全局内存的存储单元idx。第二次用16*16的块,运行时间为0.004395 sec。核心:可以看作二维网格二维块的特殊情况,第二个块的维度是1。第二次块的尺寸为128,运行时间为0.004372 sec。第一次块的尺寸为32,运行时间为0.005981 sec。16的块,运行时间为0.004395 sec。1的块,运行时间为0.007075 sec。1的块,运行时间为0.007160 sec。解决:根据提示修改为正确的函数名。

2024-10-16 16:56:14 382

原创 【CUDA 】第2章 CUDA编程模型——2.2给核函数计时

解决:之前写的sumArraysOnGPU函数只有三个参数,没有nElem参数,是对于每个线程实现的加法,形参不匹配,所以报错,修改sumArraysOnGPU函数。解决:官方代码把cpuSecond()改成了seconds()函数,但是书本上给出的是cpuSecond()函数,官方代码头文件中有seconds()函数的定义。解决:需要这些函数的定义,通过看官方给出的代码发现,官网使用了一个common.h把所有常见的头文件都放在这里,并且让函数#include包含这个头文件。解决:使用nsys命令。

2024-10-16 15:25:47 697

原创 【CUDA 】第2章 CUDA编程模型——2.1概述

编程模型主要内容:1、GPU线程组织层次结构 2、GPU内存访问层次结构。

2024-09-25 17:43:12 490

原创 【CUDA 】第1章 基于CUDA的异构并行计算

CUDA核的3个关键抽象(最小的一组语言拓展):①线程组层次②内存层次③障碍同步(在执行某个任务前,必须完成N个线程各自的任务,才能往下执行)CUDA API:驱动API 和 运行时API(不能混合使用,只能二选一用,这本书用。并行计算:多个计算资源,多个同时解决的小问题安排在不同的计算资源上。CUDA程序=主机代码(CPU)+设备代码【核代码】(GPU)异构应用:主机代码(CPU)+设备代码(GPU)异构架构:GPU是CPU的协处理器(设备端)任务相关性:一个的输出是另一个的输入。

2024-09-11 15:11:58 313

原创 LaTeX——tikz学习(1)——基本内容学习

TikZ宏包是一个十分强大的绘图宏包,它提供\tikz 命令和tikzpicture 环境。2、具体绘图指令可以放在\tikz 后面,也可以放在tikzpicture 中间。1、主文件加载tikz宏包,下面就可以使用宏包的对应命令。

2024-05-03 11:04:47 1564 1

原创 【C++】机试刷题总结day14——四、字符串——string知识点

string——>其他类型:sto系列函数(stoi(变成int)、stol(变成long)、stof(变成float)、stod(变成double))<2>字符数组不支持赋值、判断相等、比较大小——>C风格字符数组不能作为map和set的类型参数。erase(要删起始下标,要删尾后下标) 左闭右开[,) 尾后下标(终止下标的下一个位置)不推荐的原因:①性能差(机试超时) ②cout格式管理麻烦(printf小数点后2位 %.2f)(4)< <= > >= 比较大小,比较的是字典序。

2024-03-27 18:05:44 540

原创 【C++】机试刷题总结day13——三、排序和查找——查找(难※)

若查找多次x元素,查m次,时间复杂度O(mn),假设10的4次方次查找,10的6次方的个元素——>10000ms>1000ms。(3)每个字符按从小到大顺序输出——>需要另外的数据结构,记录出现的先后次序,vector动态数组,下标小先出现。(2)map:记录字符和位置(位置有重复,不能用简单整数——>①multimap可重复②动态数组vector)N个元素,查找M次,时间复杂度O(NlogN(排序)+M(查询次数)logN(每次二分查找))b可以不用建立动态数组,查完给出结果即可。

2024-03-24 22:01:16 501 1

原创 【C++】机试刷题总结day12——三、排序和查找——排序

sort函数底层:快速排序(小于枢纽放左边,大于枢纽放右边,基于比较一定存在:lhs代表左边指向的内容,rhs代表右边指向的内容if(lhs 比较 rhs) {//默认比较是小于< 不交换 } else {交换 }默认比较是小于<(升序)自定义函数(),两个参数lhs和rhs,返回bool值(true\false)函数体内是不发生交换的条件在主函数内调用sort函数,有三个参数,第三个参数是自定义的函数名。

2024-03-23 22:39:08 389 1

原创 【C++】机试刷题总结day11——二、枚举和模拟(下)map非线性数据结构

与begin,end的区别:begin、end是整个容器;(1)向字符串数组写入时,不用加取地址符号,因为str本身就是指向数组的指针。如果访问的键不存在,会新增一个键值对,键为查找的’a’,值为默认初始值0。可以通过下标访问元素,下标可以是任意类型,元素也可以是任意类型。与set区别:set内是单个元素的集合,map内是键值对的集合。键为键为char表示按键a-z,值为int表示在哪个按键。:返回key对应的最后一个值的后一个位置。(1)通过key找对应的value。:返回key对应的第一个值的位置。

2024-03-23 12:01:09 872 1

原创 【C++】机试刷题总结day10——一、枚举和模拟(下)set非线性数据结构

count==0元素不存在(更简单,无需迭代器)一共10个数,每个数可能出现或不出现,共2的10次方=1024种可能性。无需关心元素的位置,vector(增删)需要用迭代器指明位置,find函数:查找元素位置,返回迭代器;:0≤n≤10的6次方,阶乘增长很快,数据可能不是很大。5的阶乘到120,扩大范围,10的阶乘超过100万。xi≥0——>从0的阶乘开始算,0的阶乘是1。因此只需考虑0-9的阶乘,10以上的无需考虑。每次加入一个新的阶乘,里面的数量翻倍。t≥1——>阶乘的和至少有一项。

2024-03-17 22:30:37 1287 1

原创 【C++】机试刷题总结day09——一、枚举和模拟(下)list链表

创建2个动态数组,分别存储完数和盈数;单独创建一个函数用来存储因子之和,判断因子的方法:能除尽就是因子。复制输入样例时,输出的每组结果就在对应每组输入后面,因此输出结果夹杂在复制一堆输入之间。优势:list中使用erase和insert效率更高,因为底层是双向链表。不足:动态数组vector(顺序表)在中间插入删除效率低。优先选择vector,若大量插入删除,则改为list。用vector数组来存放树,0表示有树,1表示没树。(3)分糖果不能先分第一个,再分第二个,要同时分。(1)当输入0时,输入结束。

2024-03-17 16:39:28 410 1

原创 【C++】机试刷题总结day08——一、枚举和模拟(下)vector动态数组+迭代器

②内存分配:局部数组(<1MB) 全局数组(很大,但是可能超过题目限制)——>局部不够放全局,全局不够改算法。③数组作为函数参数不方便(被调用函数只能拿到数组地址,不知道数组长度)——>传2个参数(首地址,长度),多使用push_back,因为动态数组是顺序表,在中间位置插入,效率低。end函数:可以获取尾后的位置(最后一个元素的后一个没有元素的空位置)③找已知元素在vector的位置——>查找算法(下一章)——>erase函数+迭代器(指向要删除位置),迭代器的值发生变化,若还想继续插入或删除,

2024-03-14 17:51:20 1448

原创 dev c++调试查看vector内元素的数值

参考于链接: 添加查看的方式链接: 添加头文件1.错误方式:添加查看vec1,这样会导致无法继续运行2.正确方式:查看单个元素:*(&vec1[0])查看多个元素:*(&vec1[0])@2@后面数字为查看从vec1[0]开始的元素个数修改为以上的方法之后,我这边还是报错报错信息为<error: Could not find operator[].>经过再次搜索之后,我找到了解决方法,添加头文件内容这次效果如下,可以正常查看vector内的元素完整代码如下

2024-03-14 11:38:43 981

原创 【C++】机试刷题总结day07——一、枚举和模拟(下)日期问题

中表示。

2024-03-13 22:55:37 344

原创 【C++】机试刷题总结day06——一、枚举和模拟(上)模拟问题

①不要看做一个整体将图案分解为——>一行行字符串字符串再分解为——>数组中各元素②找规律:列表法先找特殊行,看元素种类(eg:空格、数字等)、数量、行号、列号③从表格中找规律:找等差数列④转换成代码。

2024-03-13 17:25:16 738

原创 【C++】机试刷题总结day05

开始王道网课,系统准备机试。内容:枚举和模拟(上)

2024-03-09 22:09:50 534 1

原创 【C++】机试刷题总结day04

旧思路:从头遍历一遍数组,根据00,01,10,11的不同情况分别处理,第0个元素单独处理,但是结果不对,需要再思考一下哪里出了问题。新思路:元素不是1就是0,因此遍历数组时,若当前元素是1,则说明前面是连续个1;若当前元素是0,说明连续个1断到了这里。利用类似线代的思想,会发现第一行变成了倒数第一列,第一行的第2列元素变成了倒数第一列的第2行元素。※※遍历结束的最后一位,如果是1,则不会进行比较。整体思路:创建一个同样大小的新数组,新数组存储应该得到的结果,最后再赋值回旧数组。

2024-03-08 22:11:06 351 1

原创 【C++】机试刷题总结day03

vector的assign函数赋值,求数组中心索引的优化思路。

2024-03-05 23:50:20 255 1

原创 【C++】机试刷题总结day02

小写字母97-122。

2024-02-21 17:41:35 134 1

原创 【C++】机试刷题总结day01

1.返回类型为vector数组 2.遍历string字符串每个字符

2024-02-20 21:43:00 357 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除