自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 直方图学习

直方图均衡化(Histogram Equalization)是一种用于增强图像对比度的图像处理技术,通过重新分配图像的像素值,使图像中的亮度级别更加均匀,以改善图像的视觉质量。:对于每个亮度级别,计算其累积分布函数(CDF),这是一个表示在该亮度级别以下像素数量累积的函数。:对于原始图像中的每个像素,将其亮度级别映射到归一化的CDF值。:将CDF的值归一化到[0, 255]的范围内。:首先,计算原始图像的灰度直方图,以了解不同亮度级别的像素数量分布。:将所有像素的亮度级别替换后,生成均衡化后的图像。

2023-11-08 11:54:33 824

原创 C++多线程

condition_variable是一个类,这个类既有构造函数也有析构函数,使用时需要构造对应的condition_variable对象,调用对象相应的函数来实现上面的功能。优点:有操作系统相关知识的应该知道,线程是轻量级的进程,每个线程可以独立的运行不同的指令序列,但是线程不独立的拥有资源,依赖于创建它的进程而存在。简单地讲,unique_lock 是 lock_guard 的升级加强版,它具有 lock_guard 的所有功能,同时又具有其他很多方法,使用起来更加灵活方便,能够应对更复杂的锁定需要。

2023-10-25 12:02:25 345

原创 CUDA学习笔记(十五)Stream and Event

Cuda stream是指一堆异步的cuda操作,他们按照host代码调用的顺序执行在device上。Stream维护了这些操作的顺序,并在所有预处理完成后允许这些操作进入工作队列,同时也可以对这些操作进行一些查询操作。这些操作包括host到device的数据传输,launch kernel以及其他的host发起由device执行的动作。这些操作的执行总是异步的,cuda runtime会决定这些操作合适的执行时机。我们则可以使用相应的cuda api来保证所取得结果是在所有操作完成后获得的。

2023-10-23 14:48:43 886

原创 CUDA学习笔记(十四) Constant Memory

转载至。

2023-10-23 14:47:57 351

原创 CUDA学习笔记(十三) Shared Memory

这就需要注意thread和bank的映射关系了,我们最希望看到的是,同一个warp中的thread获取的是不同的bank。memory padding是一种避免bank conflict的方法,如下图所示,所有的thread分别访问了bank0的五个不同的word,这时就会导致bank conflict,我们采取的方法就是在每N(bank数目)个word后面加一个word,这样就如下面右图那样,原本bank0的每个word转移到了不同的bank中,从而避免了bank conflict。

2023-10-23 14:47:14 826

原创 CUDA学习笔记(十二) CUDA库简介

上图是CUDA 库的位置,本文简要介绍cuSPARSE、cuBLAS、cuFFT和cuRAND,之后会介绍OpenACC。CUDA库和CPU编程所用到的库没有什么区别,都是一系列接口的集合,主要好处是,只需要编写host代码,调用相应API即可,可以节约很多开发时间。而且我们完全可以信任这些库能够达到很好的性能,写这些库的人都是在CUDA上的大能,一般人比不了。当然,完全依赖于这些库而对CUDA性能优化一无所知也是不行的,我们依然需要手动做一些改进来挖掘出更好的性能。

2023-10-23 14:46:07 1204

原创 CUDA学习笔记(十一)Memory Access

转载于。

2023-10-23 14:45:06 290

原创 CUDA学习笔记(十)Memory Model

本篇博文转载于,仅用于学习。

2023-10-23 14:42:15 190

原创 CUDA学习笔记(九)Dynamic Parallelism

到目前为止,所有kernel都是在host端调用,CUDA Dynamic Parallelism允许GPU kernel在device端创建调用。Dynamic Parallelism使递归更容易实现和理解,由于启动的配置可以由device上的thread在运行时决定,这也减少了host和device之间传递数据和执行控制。我们接下来会分析理解使用Dynamic Parallelism。

2023-10-23 12:07:19 679

原创 CUDA学习笔记(八)Branch Divergence and Unrolling Loop

和之前的图示相比,工作的thread数目没有变化,但是,每个thread的load/store global memory的位置是不同的。从高级语言层面是无法看出性能提升的原因的,需要从low-level instruction层面去分析,第二段代码循环次数减少了一半,而循环体两句语句的读写操作的执行在CPU上是可以同时执行互相独立的,所以相对第一段,第二段性能要好。global array index也要相应的调整,因为,相对之前的版本,同样的数据,我们只需要原来一半的thread就能解决问题。

2023-10-22 17:30:06 394

原创 CUDA学习笔记(七)Kernel性能调节

本篇博文转载于,仅用于学习。

2023-10-22 13:16:35 301

原创 ​CUDA学习笔记(六)Warp解析

本篇博文转载于,仅用于学习。

2023-10-21 23:48:09 1168

原创 ​CUDA学习笔记(五)GPU架构

一个主要的不同就是,SIMD要求所有的vector element在一个统一的同步组里同步的执行,而SIMT允许线程们在一个warp中独立的执行。在并发的warp之间切换是没什么消耗的,因为硬件资源早就被分配到所有thread和block,所以该新调度的warp的状态已经存储在SM中了。GPU中每个SM都设计成支持数以百计的线程并行执行,并且每个GPU都包含了很多的SM,所以GPU支持成百上千的线程并行执行,当一个kernel启动后,thread会被分配到这些SM中执行。

2023-10-21 23:39:46 1788

原创 ​CUDA学习笔记(四)device管理

本篇博文转载于,仅用于学习。

2023-10-21 23:32:09 618

原创 ​CUDA学习笔记(三)CUDA简介

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。线程的组织形式对程序的性能影响是至关重要的,本篇博文主要以下面一种情况来介绍线程组织形式:矩阵在memory中是row-major线性存储的:在kernel里,线程的唯一索引非常有用,为了确定一个线程的索引,我们以2D为例:首先可以将thread和block索引映射到矩阵坐标:ix = threadIdx.x + blockIdx.x * blockDim.xiy = threadIdx.y +

2023-10-21 23:29:10 280

原创 CUDA学习笔记(二)CUDA简介

本篇博文转载于,仅用于学习。CUDA是并行计算的平台和类C编程模型,我们能很容易的实现并行算法,就像写C代码一样。只要配备的NVIDIA GPU,就可以在许多设备上运行你的并行程序,无论是台式机、笔记本抑或平板电脑。熟悉C语言可以帮助你尽快掌握CUDA。

2023-10-21 23:26:04 738

原创 CUDA学习笔记(一)Hello World From GPU

本篇博文转载于,仅用于学习。

2023-10-21 20:25:37 294

原创 CUDA编程入门系列(十一)CUDA程序优化技巧

我们在设计CUDA程序的时候,要对线程块的个数进行考虑。因为GPU中流处理器SM的数量是相对固定的,所以我们应该尽量的将多个block放到同一个SM当中(至少保证每个SM中都有一个块),使得SM时刻处于活跃状态。因为SM是以warp为单位的,那么我们就要尽量的保证块的大小是32的倍数,使得所有的warp中所有的线程都处于活跃状态。如果块上的线程多的话,就可以隐藏一些内存的延迟。但是,如果一个块上的线程越多,每个线程拥有的寄存器大小就越小。优化原则:最大化并行执行。共享内存:防止bank conflict。

2023-10-21 14:43:53 264

原创 CUDA编程入门系列(十)并行规约

不同的线程访问同一资源,要进行临界操作,由原来的并行操作变成串行操作,影响了执行速度。但是随着计算的进行,s的增大,越来越少的线程处于活跃状态,当活跃的线程小于一个warp的数量的时候,还是会产生指令分化的问题。因为一个warp里面的32线程执行相同的指令,如果指令不同(即指令分化)的话,可能会导致32个线程按照串行的方式进行执行,这与我们并行的思想是相悖的。所以,这里存在一个问题,因为此处的线程要进行if的分支结构判断,所以就有可能导致不同的线程有不同的指令,导致指令分化,影响执行速度。

2023-10-21 14:24:59 1106 1

原创 CUDA编程入门系列(九)CUDA程序执行与硬件映射

SM的基本执行单元是包含32个线程的线程束,所以block的大小一般要设置为32的倍数。3.程序中的线程同时从同一程序地址执行,但是可能具有不同的行为,比如遇到了分支结构,一些线程可能进入分支,但是另外一些线程有可能不进入分支。1.kernel的线程组织层次,一个kernel实际上会启动很多线程,这些线程时逻辑上并行的,但是在物理层上不一定是并行的。2.线程同时执行相同的指令,但是每个线程都包含自己的指令地址计数器和寄存器状态,也会有自己独立的执行路径。一、GPU流式多处理器。二、CUDA内置变量。

2023-10-18 21:23:31 128

原创 CUDA编程入门系列(八) 内存管理示例代码

【代码】CUDA编程入门系列(八) 内存管理示例代码。

2023-10-18 21:05:46 53

原创 CUDA编程入门系列(七) GPU内存如何管理

共享内存定义在SM中,访问延迟比全局内存低两个数量级,访问速度比全局内存快一个数量级,共享内存定义在线程块中,线程块中每个线程都可以访问,但不可以被其他线程块访问。2.CPU内存的分配与释放是标准的,例如new和delete,malloc与free。1.GPU内存有很多种类型,例如全局,纹理,常量,共享,每种内存的管理不一样。2.GPU内存也有不同的属性,如1D,2D,3D,锁页,统一内存。Host内存属于CPU内存,传输速度比普通CPU内存快很多。4.CUDA/GPU内存与CPU内存的互相传输。

2023-10-18 21:03:43 516

原创 CUDA编程入门系列(六) GPU内存介绍

换句话说,对其的读写模式使得不需要的数据也被传输,所以,利用率低时,吞吐量下降。Kepler结构扩展到255个寄存器,一个线程如果使用更少的寄存器,那么就会有更多的常驻线程块,SM上并发的线程块越多,效率越高,性能和使用率也就越高。在cpu中,访存是访问某个地址,获得地址上的数据,但是在这里,是一次性访问banks数量的地址,获得这些地址上的所有数据,并逻辑映射到不同的bank上。2.每个SM都有一定数量的线程块分配的共享内存,共享内存是片上内存,与主存相比,速度要快很多,即低延迟,高带宽,是可编程内存。

2023-10-18 20:52:31 501

原创 CUDA编程入门系列(五) Grid,Block,Wrap,Thread

grid和block都是定义为dim3类型的变量,dim3可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,缺省值初始化为1。定义的grid和block如下所示,kernel在调用时也必须通过执行配置<<<grid,block>>>来指定kernel所使用的线程数和结构。一个线程需要两个内置的坐标变量(blockIdx,threadIdx)来唯一标识,它们都是dim3类型变量,其中blockIdx知名线程所在grid中的位置,而threadIdx知名线程所在block的位置。

2023-10-18 20:09:26 442

原创 CUDA编程入门系列(四) 向量加法示例

【代码】CUDA编程入门系列(四) 向量加法示例。

2023-10-18 19:59:58 99

原创 CUDA编程入门系列(三) CUDA编程模型

_host_:在host上执行,仅可以从host上调用,一般省略不写,不可以和global_同时用,但可和_device__,此时函数会在device和host都编译。对于一个2-dim的block,线程的ID值为,如果是3-dim的block ,线程的ID值另外线程还有内置变量gridDim,用子获得网格块各个维度的大小。其中,最重要的一个过程是调用CUD的核函数来执行并行计算,核函数kernel是CUDA中一个重要的概念,kernel核函数是在GPU上线程中并行执行的函数。

2023-10-18 17:52:52 133

原创 CUDA编程入门系列(二) GPU硬件架构综述

如果16个线程中, 有不同的线程访问同一个bank,这就会造成bank conflict(我这里先初步理解为不同的线程访问同一个bank,要按照串行的方式进行访问,即一个线程访问完,另一个线程才能访问),串行的访问方式就会使得访问效率变低。不同的GPU含有不同大小的寄存器,寄存器的大小是固定的,如果每一个块需要的寄存器大小越大,那么活跃的块数量就会减少,这就使得并行度会下降,所以在设计程序的时候,要减少寄存器的使用。每个块存在共享内存,这个共享内存的对象为同一个块内的所有线程,用于线程间的通信。

2023-10-18 16:56:40 829

原创 CUDA编程入门系列(一) 什么是GPU运算?

GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。下图为其他类型的GPU架构,其有三级的结构,第一级为GPC(图像处理簇),第二级为SM, 第三级为SP,其中每个GPC由16个SM组成,每个SM里有32个SP。基于CPU+GPU的异构计算平台可以优势互补,CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。在异构计算架构中,GPU与CPU通过。

2023-10-18 11:58:41 145

原创 ubuntu下解决插入硬盘后复制的文件为只读

请注意,操作文件系统可能需要管理员权限,所以您可能需要使用`sudo`命令来执行这些操作。在输出中找到硬盘对应的挂载点(通常在`/media`或`/mnt`目录下),并确认其挂载选项。如果您在Ubuntu系统中插入了硬盘并且发现硬盘上的文件是只读的,可能是因为文件系统的挂载选项被设置为只读。3. **复制文件:** 使用`cp`命令或者图形界面文件管理器(如Nautilus)来复制文件。2. **以读写模式重新挂载硬盘:** 如果硬盘以只读模式挂载,请使用以下命令以读写模式重新挂载它。

2023-08-06 20:33:01 1019

原创 CMake学习记录

动态链接库一般的库名称是lib库名称.so(.so代表shared object),其链接发生在程序的的执行过程中,其在编译环节仅执行链接检查,而不进行真正的链接。而动态链接库的链接发生在程序的执行过程中,其在编译环节仅执行链接检查,而不进行真正的链接,这样可以节省系统的开销。对一些常用库,g++能在默认查询路径中找到他们,但是当我们引入的外部库越来越多时,命令行编译这种方式就会变得不方便。打包到该工程的输出文件中(可执行文件或库),因此生成的文件比较大,但在运行时也就不再需要库文件了。

2023-07-16 22:34:44 162

原创 Leetcode 383 赎金信

2. 每次 magazine[i] == ransomNote[j] 则说明在magazine中找到了对应的字符可以用,把对应的ransomNote[j]擦除掉。2. 遍历ransomNote中的所有字符,判断其在哈希数组中出现的次数是否为0;思路:判断magazine的字符是否包含ransomNote 且magazine每个字符个数要大于等于ransomNote。1. 首先把magazine 中所有的字符放入哈希数组中,并计数,这里因为都是小写英文字符,所以数组的长度可以为26.

2023-06-09 14:04:42 52

原创 Leetcode 15 三数之和

如果nums[i]+nums[left]+nums[right]>0,则right--,如果nums[i]+nums[left]+nums[right]<0,则left++,直至找到nums[i]+nums[left]+nums[right]=0。③首先讨论a的去重,如果采用nums[i+1] == nums[i]的方法去重,会不适用{-1,-1,2}的情况;②我们的目的是为了找到a+b+c = 0的组合,由于已经有序,如果a已经大于0,则直接return;方法一:三重循环+去重(超时)

2023-04-18 20:06:50 101

原创 TFill:Bridging Global Context Interactions for High-Fidelity Image Completion论文阅读笔记

②在推理阶段,相邻层之家你的元素通过学习但固定的权重来链接,而不是依赖于输入的自适应权重,这就意味着长距离信息只在一个非常深的层中低效传播,导致网络趋向于以孔洞附近的信息为基础填充孔洞,而不是远距离可见像素。且生成的结果可能会和原始的外观不完全一致。②通过一个以transformer为基础的架构,这些token之间的远程交互被显式地建模,其中掩蔽令牌可以感知其他机会平等的可见令牌,而不管它们的位置如何。以前的方法通过深或大的感受野(RF)卷积来尝试这一点,但无法摆脱附近相互作用的主导地位,这是劣势。

2023-04-18 16:39:46 727 1

原创 CRFill:Generative Image Inpainting with Auxiliary Contextual Reconstruction论文阅读笔记

基于上述的结论,我们提出了一种CR Loss,通过最小化由已知区域的图像补丁组成的辅助结果的对抗性损失来鼓励网络找到最优参考区域。辅助编码器解码器网络生成辅助图像,其中已知区域不变,而缺失区域根据相似性编码器提供的相似性填充相似的已知区域。- 提出问题:当前inpainting任务中缺乏对缺失区域与已知区域之间对应关系的监督信号,可能无法找到合适的参考特征,这往往会导致结果中的伪影。辅助编码器解码器网络生成辅助图像,其中已知区域不变,而缺失区域根据相似性,用已知区域中patch的加权和替换。

2023-04-18 14:54:03 370 1

原创 Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention论文阅读笔记

②feature shift实现的local attention:以2*2的特征图为例,按照左上,上,右上,左,中,右,左下,下,右下的方式移动特征图窗口。③作者提出的利用Depthwise实现的local attention:以2*2的特征图为例,先进行padding,而后通过不同的固定权重的3*3的窗口得到九个不同的特征,再生成键值对。①im2col实现的local attention:以2*2的特征图为例,先进行padding,而后通过3*3的滑动窗口得到H*W个窗口值,再进行展平,得到键值对。

2023-04-17 16:25:31 1091 2

原创 Leetcode 59 螺旋矩阵

思路:从外到内,方向按照 右->下->左->上 的方式进行填充,

2023-04-16 16:46:29 90

原创 Zero-DCE:Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation论文阅读笔记

其中,每个输入的像素都会在输入之前被归一化至0-1.X代表像素坐标 ,等式左端代表增强后的图像,a为可训练的参数,其取值范围在-1~1之间用来调整LE曲线的峰值和控制曝光等级,如下图所示。从图中可以看到,当进行四次迭代的时候,该曲线的曲率已经非常大,因此它具有较强的动态范围条件能力。这样的二次曲线在一些比较挑战性的场景例如非常暗的环境下的调节能力是有限的。网络结构由七个卷积层组成。受照片编辑软件中曲线调整的启发,设计了一种可以自动将弱光图像映射到增强图像的曲线,其中自适应曲线参数完全取决于输入图像。

2023-04-05 20:37:48 235

原创 ViT:AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE论文阅读笔记

利用卷积操作将224*224的图片分割成14*14个大小为16*16的patch。具体操作为 利用num_dim个窗口大小为16*16,步长也为16的卷积核进行卷积,得到14*14*num_dim的特征图,而后进行reshape操作成196*num_dim的向量。一共组成197个维度为num_dim向量。再通过多头注意力机制捕获不同patch之间的关系,这个过程中,token cls会收集其他token的信息。输入为一张大小为224*224的图片,将图片分成14*14个大小为16*16的patch。

2023-03-30 17:08:04 89

原创 Parallel Multi-Resolution Fusion Network for Image Inpainting论文阅读笔记

整个网络分成四个分支进行,对应四个不同的分辨率,从上往下依次为256*256, 128*128,64*64,32*32。具体来说,首先将特征图从高分辨率(256,128,64)下采样到最低分辨率(32),再及逆行concat拼接,而后利用自注意力机制计算注意力分数图A。Ig为最终的输出结果。其中l的取值范围为{3,2,1,0}分别代表四个不同的分辨率{256*256,128*128,64*64,32*32}.其中m是当前像素p的mask value,sum(Mp)是当前窗口的值之和,q是需要定义的优先级。

2023-03-30 12:03:23 164 1

原创 Masked Autoencoders Are Scalable Vision Learners(MAE)论文阅读笔记

同样,编码器结构也是利用ViT进行搭建,但不同的是,MAE的编码器只应用于可见的(没有隐蔽)的patch,将可见的patch进行token embbeding,然后通过一系列的Transformer块的处理。像所有的Auto encoder一样,MAE利用编码器将观察到的信号映射到一个潜在的表示,再利用解码器,从潜在的表示重构原始信号。Decoder模块只存在于预训练的重建图像任务中,因此可以独立于encoder去设计decoder,文中采用轻量级的decoder,即Transformer块的数量更少。

2023-03-30 12:01:14 129 1

空空如也

空空如也

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

TA关注的人

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