CUDA
CUDA 相关知识总结
ShaderJoy
醉心于研究一些特效(用代码来画画),曾涉猎过图形图像视频处理 、计算机视觉 、增强现实/虚拟现实等技术领域,就职于美图。
展开
-
CUDA 共享内存的 Bank Conflict 实例分析与优化
引言CUDA将 shared memory 按照 4 字节或 8 字节(默认 4 字节,可以设置为 8 字节)被划分到 32 个 bank (楼)中,不同bank 之间的内存能同时读写,但是同一个 bank 的不同地址(同一栋楼的不同层)的数据则只能串行读写(如果是同一个 bank 的同一个地址则可以broadcast,不会出现 bank conflict),因此当同一个 warp 的线程去访问 shared memory 数据时,如果有两个以上线程访问了同一个 bank 的不同地址...原创 2020-11-26 14:51:52 · 1895 阅读 · 0 评论 -
【转载】各种 NVIDIA 架构所匹配的 arch 和 gencode
Matching CUDA arch and CUDA gencode for various NVIDIA architecturesI’ve seen some confusion regarding NVIDIA’s nvcc sm flags and what they’re used for:When compiling with NVCC, the arch flag (‘-arch‘) specifies the name of the NVIDIA GPU architecture t转载 2020-11-24 19:23:14 · 11425 阅读 · 0 评论 -
NVIDIA System Management Interface【NVIDIA-SMI】命令备忘
NVIDIA System Management Interface -- v456.71NVSMI provides monitoring information for Tesla and select Quadro devices.The data is presented in either a plain text or an XML format, via stdout or a file.NVSMI also provides several management operation.原创 2020-11-22 13:39:08 · 1170 阅读 · 0 评论 -
CUDA 专业小贴士:编写灵活的内核与网格-跨步循环
CUDA 编程中最常见的任务之一是使用内核并行化循环。让我们用我们的老朋友SAXPY()来举个栗子。下面是基本的顺序实现,它使用 for 循环。为了有效地并行化,我们需要启动足够的线程来充分利用 GPU 。void saxpy(int n, float a, float *x, float *y){ for (int i = 0; i < n; ++i) ...翻译 2019-03-21 02:22:34 · 1353 阅读 · 0 评论 -
协作组:灵活的 CUDA 线程编程
英文原文来自NVIDIADeveloper Blog 官方手册在有效的并行算法中,线程通过合作并共享数据来执行集体计算。要共享数据,线程必须同步。共享的粒度因算法而异,因此线程同步应该是灵活的。使同步成为程序的显式部分,来确保安全、可维护和模块化。为了满足这些需求,CUDA 9 引入了协作组,它通过扩展 CUDA 编程模型,从而允许内核动态地组织线程组。从历史上看,CUDA 编程模型...翻译 2019-03-22 00:56:18 · 2248 阅读 · 3 评论 -
优化加速的导向滤波(Guided Filter)【CUDA】【OpenCV】
原理可以参看:白马负金羁的《导向滤波(Guided Filter)的解析与实现》 ,写得很清晰透彻我实现的效果如下原图(894*1080,由于笔记本屏幕不够大,截图有截断)单通道的导向滤波1.CPU 版的 Guided Filter 和 Fast Guided Filter (缩放倍数为 2,何凯明大神加了一个 resize 就成了新算法,大神就是大神!) 的耗时(循环 ...原创 2019-03-15 11:45:04 · 4134 阅读 · 9 评论 -
一种基于视神经网络的高动态范围(HDR)图像自适应局部色调映射的实现【OpenCV】【CUDA】
原理是基于这篇论文——《Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images》论文提出的背景虽然可以从不同曝光的照片中获得包含真实场景全动态范围的高动态范围 (HDR) 图像,但是普通显示器等低动态范围(LDR)显示设备无法处理场景的全动态范围。LDR 设备只能显示两个数量级的。一旦将 H...原创 2019-03-11 13:05:21 · 4147 阅读 · 4 评论 -
CUDA 的块间同步方法
CUDA 块间同步方法有以下三种① Lock-Based Synchronization② Lock-Free Synchronization③ __threadfence()基于锁的块间同步CUDA 基于锁的同步的基本思想是使用一个全局互斥量变量来计算到达同步点的线程块的数量。如下代码所示,在 barrier 函数 __gpu_sync() 中,在一个块完成它的计算之后...原创 2019-03-07 12:35:11 · 7836 阅读 · 7 评论 -
【转载】装机知识显卡篇,一篇文章让小白透彻的了解显卡
转自 **欢乐时光**显卡可能是你电脑中最贵、也是对玩游戏影响最大的配件了。那么今天我们就来说一说显卡一、显卡是什么?显卡是绘制电脑图像的东西,你在电脑上看到的任何图像、任何动画都是显卡一张一张画出来的。一张一张的图片高速播放,就成了我们看到的连贯、流畅的画面。而显卡性能的优劣就体现在这一张一张的图片上,高级的显卡每秒能画出几百张高特效的图片;低级的显卡每秒只能画出十几二十张低画质的...转载 2019-03-02 12:44:45 · 5004 阅读 · 2 评论 -
CUDA专业小贴士:通过 Warp-聚合的原子操作来优化过滤
注:这篇文章已经(于 2017年11月)更新为 CUDA 9 和最新的 GPU。NVCC编译器现在可以在许多情况下自动为原子操作执行 warp-聚合,因此无需额外的工作就可以获得更高的性能。事实上,编译器生成的代码比手工编写的 warp 聚合代码更快。这篇文章主要是为那些想了解它是如何工作的,并将类似的技术应用于其他问题的人准备的。在本文中,我将介绍 warp-聚合的原子操作,这是一种可以...翻译 2019-03-21 20:54:24 · 2305 阅读 · 0 评论 -
CUDA 6/8 中的统一内存
原文通过CUDA 6,英伟达推出了 CUDA 平台历史上最引人注目的编程模型改进之一——统一内存。在当今典型的PC或集群节点中,CPU和GPU的内存在物理上是不同的,并由PCI-Express总线分隔开。在 CUDA 6 之前,这正是程序员看待事物的方式。CPU 和 GPU 之间共享的数据必须分配在两个内存中,并由程序显式地在它们之间复制。这给 CUDA 程序增加了很多复杂性。统一内存...翻译 2019-12-16 10:30:41 · 1914 阅读 · 0 评论 -
统一内存的性能调优
原文为了实现统一内存的良好性能,必须达到以下目标:应该避免错误:虽然可回放的错误对于启用更简单的编程模型是基本的,但它们可能严重损害应用程序的性能。错误处理可能需要几十微秒,因为它可能涉及 TLB 失效、数据迁移和页表的更新。同时,应用程序的某些部分的执行将被停止,从而可能影响整体性能。 数据应该是访问处理器的本地数据:如前所述,当数据被放置在访问处理器的本地时,内存访问延迟和带宽明显更...翻译 2019-12-16 10:33:08 · 1218 阅读 · 0 评论 -
页锁主机内存
原文运行时提供的函数允许使用分页锁定(也称为固定)主机内存(与malloc()分配的常规可分页主机内存相反):cudaHostAlloc() 和 cudaFreeHost() 分配和释放页锁定的主机内存; cudaHostRegister() 将通过 malloc() 分配的内存的一定范围设置为页面锁定内存(限制参见参考手册)。使用页面锁定的主机内存有几个好处:页面锁定的主机内存和...翻译 2019-12-16 10:35:57 · 1015 阅读 · 0 评论 -
高性能几何多重网格与 GPU 加速
英文原文线性求解器可能是科学计算应用中最常见的工具。求解方程有两种基本方法:直接法和迭代法。直接方法通常是健壮的,但是需要额外的计算复杂度和内存容量。与直接求解器不同,迭代求解器需要最小的内存开销,并且具有更好的计算复杂性。然而,这些求解器在变量数量上仍然是超线性的,并且通常具有较慢的低频误差收敛速度。最后,提出了一种多网格迭代方法,通过求解不同分辨率的问题,并使用较粗的网格平滑低频误差,...翻译 2019-12-16 10:37:21 · 1428 阅读 · 1 评论 -
GPU 专业小贴士:在 Maxwell 架构上使用共享原子计算快速直方图
英文原文直方图是一种重要的数据表示形式,在计算机视觉、数据分析和医学成像等领域有着广泛的应用。直方图是数据分布在预定义的 bin 上的图形表示。输入数据集和 bin 的数量可能会因领域的不同而有很大的不同,所以让我们关注最常见的用例之一:每个颜色通道使用256个 bin 的图像直方图。即使我们将使用特定的问题设置,同样的算法也可以使其他计算领域受益。一个基本的串行图像直方图计算比较简单。对...翻译 2019-12-16 10:38:28 · 1065 阅读 · 0 评论 -
投票和洗牌以优化原子操作
原文几年前,我开始研究我的第一个CUDA实现的多粒子碰撞动力学(MPC)算法,一个粒子在 cell 内的代码,用来模拟溶剂和溶质之间的流体动力学相互作用。作为该算法的一部分,需要对若干粒子参数进行求和,计算出一定的 cell 参数。这是在 Tesla GPU 架构(比如 GT200 GPU,计算能力1.x)的时代,它的原子操作性能很差。我开发的一种链表方法在 Tesla 和 Fermi 上运行...翻译 2019-12-16 10:40:52 · 1046 阅读 · 0 评论 -
CUDA 统一内存的技术内幕
原文我之前的介绍性文章“CUDA C++更简单的介绍”介绍了CUDA编程的基础,展示了如何编写一个简单的程序,将两个数组的数字分配给 GPU 可访问的内存,然后在 GPU 上把它们相加起来。为此,我向您介绍了统一内存,它使分配和访问数据变得非常容易,这些数据可以由系统中任何处理器(CPU或GPU)上运行的代码使用。图1所示。统一内存是系统中任何处理器都可以访问的单个内存地址空间。我用...翻译 2019-12-16 10:34:42 · 1506 阅读 · 0 评论 -
CUDA 的硬件实现
原文地址NVIDIA 的 GPU 架构是围绕可扩展的多线程流多处理器阵列(SMs)构建的。当主机 CPU 上的 CUDA 程序调用内核网格时,网格的块被枚举并分配给具有可用执行能力的多处理器。线程块的线程在一个多处理器上并发执行,多个线程块可以在一个多处理器上并发执行。当线程块终止时,在空出的多处理器上启动新的块。多处理器被设计成同时执行数百个线程。为了管理如此大量的线程,它使用了 SIM...翻译 2019-12-16 10:39:16 · 1115 阅读 · 0 评论 -
分别使用 TensorRT 和 CUDA 加速 MTCNN
Github 现有的 TensorRT 加速的 MTCNN 【PKUZHOU/MTCNN_FaceDetection_TensorRT】不是基于插件的,而是走了使用 scale和 ReLU 、eltwise-sum 层 “曲线救国”的路线——PKUZHOU 认为 PReLU 会破坏 TensorRT 的 CBR 优化,但实际上实现 PReLU 插件以后耗时更少,如图左侧是“曲线救...原创 2019-02-13 20:15:39 · 7167 阅读 · 15 评论 -
OpenCV 的 Non Local Means(CUDA 版) 源码解析
效果如图:非局部均值滤波(Non Local Means)算法其出发点是——在同一幅图像中对具有相同性质的区域进行分类并加权平均得到的图片,应该降噪效果也会越好。意味着它使用的是图像中的所有像素(实际上是在一个搜索窗口内的所有像素),这些像素根据某种相似度进行加权平均。与双线性滤波、中值滤波等利用图像局部信息来滤波不同,它利用了整幅图像进行去噪。即以图像块(邻域)为单位在图像中寻找相...原创 2019-02-28 13:57:21 · 2857 阅读 · 0 评论 -
L0 范数图像平滑(L0 Smooth) 的原理和 GPU 加速【CUDA】
一、概述原作者提出了一种新的图像编辑方法,通过增加过渡的陡峭度,同时消除了一个低振幅结构的可管理程度,特别有效地锐化主要边缘。这种看似矛盾的效果是在一个利用 L0 梯度最小化的优化框架中实现的,它可以全局控制产生多少个非零梯度,以一种稀疏控制的方式近似出显著的结构。与其他边缘保持平滑方法不同,原作者的方法不依赖于局部特征,而是全局定位重要的边缘。它作为一种基本的工具,有许多应用场景,尤其有利于...原创 2019-02-21 21:11:00 · 5224 阅读 · 0 评论 -
nvprof --help
Usage: nvprof [options] [application] [application-arguments]Options:--aggregate-mode <on|off>Turn on/off aggregate mode for events and metrics specifiedby subsequent "--events" and "--...原创 2018-10-29 20:56:06 · 1740 阅读 · 0 评论 -
CUDA性能优化----kernel调优(nvprof工具的使用)
1、引言本文主要介绍并行分析,涉及掌握nvprof的几个metrics参数,所用的例子是CUDA性能优化----线程配置一文中所提到的sumMatrix2D.cu例子。接下来本文会做一些列的试验,测试环境:Tesla M2070一块,CUDA 6.0,操作系统:Red Hat 4.1.2-50,gcc version 4.1.2 20080704首先回顾一下sumMatrix2D的kern...转载 2018-10-29 17:01:19 · 4986 阅读 · 0 评论 -
CUDA C 最佳实践:指令优化【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图原创 2018-10-26 11:57:48 · 988 阅读 · 0 评论 -
CUDA C 最佳实践:计时和带宽【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图原创 2018-10-21 21:00:00 · 979 阅读 · 0 评论 -
CUDA C 最佳实践:设备内存空间【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图原创 2018-10-25 23:37:31 · 1265 阅读 · 1 评论 -
CUDA C 最佳实践:执行配置优化【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图原创 2018-10-25 22:48:23 · 1110 阅读 · 1 评论 -
CUDA C 最佳实践:控制流【读书笔记】
由于 CSDN 的图片缩放机制,请点击原图查看原创 2018-10-25 22:15:26 · 1084 阅读 · 3 评论 -
CUDA C 最佳实践:优化主机和设备之间的内存传输【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图原创 2018-10-21 15:41:28 · 1385 阅读 · 0 评论 -
NVIDIA 工具扩展(NVTX)【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图代码示例:/** Copyright 1993-2010 NVIDIA Corporation. All rights reserved.** NOTICE TO USER:** This source code is subject to NVIDIA ownership rights under U.S. and...原创 2018-10-28 12:05:22 · 6269 阅读 · 3 评论 -
分别以 Python, C++ 和 CUDA 探索 K-Means 算法【读书笔记】
原文链接:http://www.goldsborough.me/c++/python/cuda/2017/09/10/20-32-46-exploring_k-means_in_python,_c++_and_cuda/由于 CSDN 的图片缩放机制,请点击原图查看 本文作者最后基于共享内存归约(移除原子操作)的 CUDA 代码的确是有问题的...原创 2018-10-20 19:26:17 · 1305 阅读 · 0 评论 -
cuDNN:用于深度学习的高效原语【读书笔记】
讲解了 cuDNN 实现的内部原理,以及和传统卷积进行了性能比较由于CSDN对图片高度的限制,请点击原图查看原创 2018-10-19 13:49:47 · 1700 阅读 · 0 评论 -
使用 CuDNN 进行卷积运算【读书笔记】
原文链接 http://www.goldsborough.me/cuda/ml/cudnn/c++/2017/10/01/14-37-23-convolutions_with_cudnn/ 以下为长截图,CSDN 限定了图片长度,请点击查看原图#include <cudnn.h>// http://www.goldsborough.me/cuda/ml/cudnn/...原创 2018-10-18 22:51:24 · 6525 阅读 · 6 评论 -
nvprof --query-events
Available Events:Name DescriptionDevice 0 (GeForce GTX 970M):Domain domain_a:tex0_cache_sector_queries: Number of texture cache 0 requests. This increments by 1 for each 32-byte access.te...原创 2018-10-29 20:57:16 · 1204 阅读 · 0 评论 -
nvprof --query-metrics
Available Metrics:Name DescriptionDevice 0 (GeForce GTX 970M):sm_efficiency: The percentage of time at least one warp is active on a specific multiprocessorachieved_occupancy: Ratio of the...原创 2018-10-29 20:58:16 · 1560 阅读 · 0 评论 -
L0 范数图像平滑(L0 Smooth) 代码及详细注释 【OpenCV】
原理可以参考原作者的论文以及这位大神写的博客OpenCV 实现话不多说,附上C++代码cv::Mat L0Smoothing(cv::Mat &im8uc3, double lambda = 2e-2, double kappa = 2.0) { // convert the image to double format int row = im8uc3.row...原创 2016-10-15 20:54:21 · 9152 阅读 · 8 评论 -
cublasSgemm函数的使用笔记
实际的运算为C^T=alpha*B^T*A^T+beta*C^T由于C^T的存储也是按列的,所以计算结果取出来刚好等于 C,可以省去转置的步骤。注:maxtrix_size.uiWB 表示,B^T 的行数、C^T的行数maxtrix_size.uiHA表示,A^T 的列数maxtrix_size.uiWA表示,B^T 的列数、A^T的行数相关函数和参数说明:...原创 2018-12-11 18:35:28 · 2341 阅读 · 0 评论 -
nvcc --help 【命令备忘】
C:\Users\panda>nvcc --helpUsage : nvcc [options] <inputfile>Options for specifying the compilation phase============================================More exactly, this option specifies...原创 2018-11-27 13:44:38 · 2032 阅读 · 0 评论 -
CUDA C 最佳实践:应用程序性能分析【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图gprof:gprof 支持的选项:-b 不再输出统计图表中每个字段的详细描述。-q 只输出函数的调用图(Call graph的那部分信息)。-p 只输出函数的时间消耗列表。-e Name 不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 -e...原创 2018-11-05 20:46:35 · 1163 阅读 · 0 评论 -
CUDA 矩阵转置的优化问题 【读书笔记】
以下为长截图,CSDN 限定了图片长度,请点击查看原图Patrition Camping:什么是 Patrition Camping原创 2018-11-05 20:17:00 · 1761 阅读 · 2 评论