![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CUDA
tiemaxiaosu
这个作者很懒,什么都没留下…
展开
-
GeForce GTX 970 硬件特性
GeForec GTX 970 具有特性:SM(流处理器簇): 13 其中每个SM 有128个核,即:13*128=1664个核原创 2016-10-24 16:12:56 · 617 阅读 · 0 评论 -
CUDA 学习(十五)、应用程序性能优化
一、优化策略 针对程序的性能优化,有以下7个策略: 策略1:理解问题,并正确分解为串行/ 并行的工作负载。 策略2:理解并优化内存带宽、延迟和缓存使用的问题。 策略3:理解与主机端传输数据的玄机。考查锁页内存、零复制内存的表现和某些和某些硬件的带宽限制。 策略4:理解线程结构和计算能力,并了解它们对性能的影响方式。转载 2016-10-28 10:55:56 · 716 阅读 · 0 评论 -
CUDA 学习(十六)、优化策略1:并行/串行在GPU/ CPU 上的问题分解
一、问题分解 这里的基本议题是:这个问题可以被分解成并行运行的组块吗?也就是,是否有机会发掘出问题中的并发性?假设能够把问题分为多个并发快,那接下来的问题是有多少个并发块?CPU并行化的一个主要限制因素经常是没有足够大粒度(或粗粒度)的并行工作要做。GPU运行成千上万的程序,所有问题需要被分解成上千个块,而不是像CPU那样只执行少数并发任务。问题的分解应该总是从数据开始,考虑执行的转载 2016-10-28 14:10:27 · 1928 阅读 · 0 评论 -
CUDA 学习(十七)、优化策略2:内存因素
一、内存带宽 内存带宽和延迟是所有应用程序都要考虑的关键因素,尤其是GPU应用程序。带宽是指与某个给定目标之间传输的数据量。在GPU的情况下,我们主要关心的是全局内存带宽。延迟则是操作完成所用的时间。 GPU上的内存延迟设计为由运行在其他线程束中的线程所隐藏。当线程束访问的内存位置不可用时,硬件向内存提交一次读或者写请求。如果同一线程束上其他线程访问的是相邻内存位置转载 2016-10-28 16:06:08 · 2201 阅读 · 0 评论 -
VS2013 配置CUDA
一、环境:Windows10家庭版 64位 Virtual Stadio 2013 CUDA 8.0二、工程建立1、打开vs2013并创建一个空win32程序,创建一个cuda_samples的解决方案和cuda_test1项目:2、右键源文件–>添加–>新建项,如下图所示:3、选择NIVIDIA CUDA 8.0原创 2016-10-19 09:47:19 · 10196 阅读 · 0 评论 -
CUDA 学习(十八)、优化策略3:传输
一、锁页内存 主机内存有较大数量的锁页内存。锁页内存允许GPU上的DMA(直接内存访问)控制器请求主机内存传输而不需要CPU主机处理器的参与。因此,在管理传输或从磁盘将换出的页面调回时,没有加载操作需要劳烦主机处理器处理。 在GPU上分配的内存默认情况下为锁页内存,这只是因为GPU不支持将内存交换到磁盘上。我们关心的是在主机处理器上如何分配锁页内存。为了分配锁转载 2016-10-28 18:25:17 · 1978 阅读 · 0 评论 -
VS2013 编译 OpenCV_CUDA 工程编译出错
编译出现下面错误Error7 error LNK2019: unresolved external symbol"void __cdecl swap_rb_caller(struct cv::cuda::PtrStepSz const &,struct cv::cuda::PtrStep,struct CUstream_st *)"(?swap_rb_caller@@YAXAEB原创 2016-10-19 17:45:54 · 1370 阅读 · 0 评论 -
CMake 配置编译OpenCV+CUDA
参考:http://bikulov.org/blog/2013/12/24/example-of-cmake-file-for-cuda-plus-cpp-code/在CMakeLists.txt 文件如下:CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(gpuMat)# CUDA packageFIND_PACKAGE(C原创 2016-10-19 17:57:27 · 4154 阅读 · 0 评论 -
CUDA 学习(十九)、优化策略4:线程使用、计算和分支
一、线程内存模式 把应用程序分解成大小合适的网格、线程块和线程,是保证CUDA 内核性能的关键环节之一。包括GPU在内的几乎所有的计算机设计,内存都是瓶颈。线程布局的一个糟糕的选择通常也会导致一个明显影响性能的内存模式。转载 2016-10-31 14:29:29 · 2003 阅读 · 0 评论 -
CUDA 学习(二十)、优化策略5: 算法
一、概述 如果要考虑算法,我们需要先思考如下问题: (1)、如何将问题分解成块或片,然后如何将这些块分解成线程; (2)、线程如何访问数据以及产生什么样的内存模式; (3)、算法总共要执行多少工作以及串行化的实现方法有何显著不同;二、排序 可用的排序算法有很多,其中有一些可以轻松、高效地在GPU 上实现,但也有转载 2016-10-31 15:08:43 · 766 阅读 · 0 评论 -
CUDA 学习(二十一)、优化策略6: 资源竞争
一、识别瓶颈 分析瓶颈工具: (1)、Visual Profiler 对已实现的代码进行分析,我们首先可以考虑的就是SDK 中提供的那些分析工具。比如,NVIDIA Visual Profile。这是一款多平台的工具。它能指出在我们内核中哪些是错误的,并告诉我们该如何改进。 (2)、Parallel Nsight转载 2016-10-31 16:33:46 · 1178 阅读 · 0 评论 -
CUDA 学习(二十二)、优化策略7: 自调优应用程序
一、概述 考虑如下一些主要的因素:(1)主机到GPU 的数据传入/ 传出;(2)内存合并;(3)启动配置;(4)理论上和实际的占有率;(5)缓存利用率;(6)共享内存使用率以及冲突;(7)分支;(8)指令级并行;(9)设备计算能力;二、识别硬件 在任何优化过程中的第一步都要知道什么硬件是可用的以及它是什么。三、设备利用转载 2016-10-31 17:08:12 · 797 阅读 · 0 评论 -
CUDA 学习(十四)、纹理内存
一、概述 使用纹理内存主要基于以下两个目的:(1)计算能力为1.x 与3.x 硬件上的缓存机制;(2)基于硬件的内存读取操作。二、纹理缓存 由于在计算能力为1.x 的硬件上根本没有高速缓存,因此,每个SM上的 6-8KB 的纹理内存为此设备提供了唯一真正缓存数据的方法。然而,随着费米架构的硬件出现,一级缓存最大可达到48KB,共享二级缓存最大可达到76转载 2016-10-27 18:12:39 · 1316 阅读 · 0 评论 -
CUDA 学习(十三)、全局内存
一、概述GPU的全局内存之所以是全局的,主要是因为GPU与CPU都可以对它进行写操作。任何设备都可以通过PCI-E总线对其进行访问。GPU之间不通过CPU,直接将数据从一块GPU卡上的数据传输到另一个GPU卡上。转载 2016-10-27 17:23:47 · 1394 阅读 · 0 评论 -
CUDA 学习(四)、线程
一、概述 英伟达的硬件调度是采用SPMD(单程序多数据),属于SIMD(单指令多数据)的一种变体。线程是并行程序的基本构建块。二、CPU与GPU的差异 GPU和CPU设备的架构是迥异的。CPU的设计是用来运行少量比较复杂的任务。GPU的设计则是用来运行大量比较简单的任务。CPU的设计主要是针对大量离散而不相关任务系统。而GPU的设计主要是针对解决那些可以转载 2016-10-25 14:16:32 · 1467 阅读 · 0 评论 -
CUDA 学习(三)、CUDA硬件概述
一、PC架构 先看一下酷睿架构图: PCI-E 是一个有意思的总线。与其上一代PCI(外围设备互连)总线不同,PCI-E提供一个确定的带宽。在原先的PCI系统中,每个设备都可以使用总线的全部带宽,但一次只能让一个设备使用。因此,你增加的PCI卡越多,每个卡能够获得的可用带宽就越少。PCI-E总线通过引入PCI-E通转载 2016-10-24 14:55:03 · 2314 阅读 · 0 评论 -
CUDA 学习(二)、使用GPU理解并行计算
一、并发性 由于“易并行”不需要或者只需要少许线程间或线程块间通信,所以CUDA是很理想的并行求解平台。它用基于片上资源的、显式的通信原语来支持线程间通信。转载 2016-10-24 11:40:45 · 5166 阅读 · 0 评论 -
CUDA 学习(一)、超级计算机介绍
一、概述 超级计算式我们在现代处理器中看到的许多技术的发展动力。超级计算机和桌面计算正向着异构计算发展,人们试图将中央处理器(CPU)和图形处理器(GPU)技术混合在一起来实现更高的性能。二、冯. 诺依曼计算机架构 在冯. 诺依曼计算机架构中,处理器从存储器中取出指令、解码、然后执行指令。内存速度和时钟速度的比例是限制CUP和GPU 吞吐量的一个重要因素。下图转载 2016-10-21 17:58:19 · 947 阅读 · 0 评论 -
CUDA 学习(五)、线程块
一、概述 在GPU编程上,通常我们可能会创建成千上万个并发线程来实现设备上的高吞吐量。例如: 这将会调用名为 some_kernel_func 的GPU函数共 2*128 次,每次都是不同的线程。然而,这样做通常会使 thread_idx 参数的计算变得更加复杂,而 thread_idx 通常又用来表示数组的下标。因此,内核函数如下转载 2016-10-25 14:46:18 · 2135 阅读 · 0 评论 -
CUDA 学习(六)、线程网格
一、概述 一个线程网格是由若干线程块组成的,每个线程块是二维、三维的,拥有X轴、Y轴、Z轴。此时,每次最多能开启Y*X*Z*T 个线程。 通常线程块中线程数量最好是一个线程束大小的整数倍,即32 的整数倍。由于设备是整个线程束为单位进行调度,如果我们不把线程块上的线程数目设成32的整数倍,则最后一个线程束中有一部分线程是没有用的,因此我们必须设置一个限制条件进行限制转载 2016-10-25 16:36:02 · 4212 阅读 · 0 评论 -
CUDA 学习(七)、线程束
一、概述 线程束是GPU的基本执行单元。GPU是一组SIMD 向量处理器的集合。每一组线程或线程束中的线程同时执行。在理想状态下,获取当前指令只需要一次访存,然后将指令广播到这个线程所占用的所有SP中。 当使用GPU进行编程时,必须使用向量类型指令,因为GPU采用的是向量体系结构,只有让代码在成千上万个线程上运行才能充分高效利用GPU的资源。 当前,GP转载 2016-10-25 17:35:01 · 3791 阅读 · 0 评论 -
CUDA 学习(八)、线程块调度
一、调度 如果我们有19个线程块和4个SM,将所有的线程都分配到一个SM上进行处理,显然不够合理。如果让前3个SM每个处理6个线程块,最后一个SM处理一个线程块,那么最后一个线程块就会很快处理完,然后SM会闲置。这样做设备的利用率会很低。 如果我们用轮流交替的方式将线程块分配到SM 中,每个SM处理4个线程块(4*4=16 个线程块),还剩下三个线程单独用一个SM转载 2016-10-25 17:54:30 · 2468 阅读 · 0 评论 -
CUDA 学习(九)、CUDA 内存
一、CPU内存 在传统的CPU模型中,内存是线性内存或平面内存,单个CPU核可以无约束地访问任何地址内存。在内存处理中有两个重要的概念,一个是存储带宽,即在一定时间内从DRAM 读出或写入的数据量。另一个是延迟,即响应一个获取内存的请求所花费的时间,通常这个时间会是上百个处理器周期。二、高速缓存 高速缓存是硬件上非常接近处理器核的高速存储器组。高速缓存的转载 2016-10-26 10:46:52 · 1291 阅读 · 0 评论 -
CUDA 学习(十)、寄存器用法
一、映射寄存器方式 CPU与GPU架构的一个主要区别就是CPU与GPU映射寄存器的方式。CPU通过使用寄存器重命名和栈来执行多线程。为了运行一个新的任务,CPU需要进行上下文切换,将当前所有寄存器的状态保存到栈(系统内存)上,然后从栈恢复当前需要执行的新线程上次的执行状态。这些操作通常需要花费上百个CPU时钟周期。如果在CPU上开启过多的线程,时间几乎都将花费在上下文切换过程中寄转载 2016-10-26 14:00:14 · 5930 阅读 · 0 评论 -
CUDA 学习(十二)、常量内存
一、概述 常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。常量内存有两个特征,一个是高速缓存,另一个是它支持将单个值广播到线程束中的每个线程。 常量内存,通过名字我们就能猜到它是只读内存。这种类型的内存要么是在编译时声明为只读内存,要么是在运行时通过主机端定义为只读内存。常量只是从GPU内存的角度而言。常量内存大小被限制为64K。转载 2016-10-26 17:20:59 · 2553 阅读 · 0 评论 -
GpuMat ROI
在引用GpuMat数据的ROI时,需要保证该数据在Gpu内存中存储是连续的。使用gpu::createContinuous创建连续空间。cuda::GpuMat dst_pyr_laplace_tmp(dst_pyr_laplace_gpu(rc)); 或者cuda::GpuMat dst_pyr_laplace_tmp = dst_pyr_laplac原创 2017-01-16 23:21:38 · 1411 阅读 · 1 评论