自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(177)
  • 收藏
  • 关注

原创 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 1366 1

转载 OpenCV InputArray和OutputArray

InputArray这个接口类可以是Mat、Mat_、Mat_、vector、vector>、vector。也就意味着当你看refman或者源代码时,如果看见函数的参数类型是InputArray型时,把上诉几种类型作为参数都是可以的。有时候InputArray输入的矩阵是个空参数,你只需要用cv::noArray()作为参数即可,或者很多代码里都用cv::Mat()作为空参。这个类

2017-01-15 22:33:11 2594

转载 OpenCV Mat 拷贝与ROI

(1)浅拷贝//注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)  Mat a;  Mat b = a; //a "copy" to b  Mat c(a); //a "copy" to c  //注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)

2017-01-15 22:11:17 6140

转载 opencv中Mat使用

转载:http://www.360doc.com/content/17/0115/21/39864082_622698495.shtml(一)Mat矩阵中数据指针Mat.data是uchar类型指针,CV_8U系列可以通过计算指针位置快速地定位矩阵中的任意元素。二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。但对于多通道的非uns

2017-01-15 21:52:28 1534

转载 CUDA 学习(二十二)、优化策略7: 自调优应用程序

一、概述       考虑如下一些主要的因素:(1)主机到GPU 的数据传入/ 传出;(2)内存合并;(3)启动配置;(4)理论上和实际的占有率;(5)缓存利用率;(6)共享内存使用率以及冲突;(7)分支;(8)指令级并行;(9)设备计算能力;二、识别硬件         在任何优化过程中的第一步都要知道什么硬件是可用的以及它是什么。三、设备利用       

2016-10-31 17:08:12 784

转载 CUDA 学习(二十一)、优化策略6: 资源竞争

一、识别瓶颈        分析瓶颈工具:        (1)、Visual Profiler         对已实现的代码进行分析,我们首先可以考虑的就是SDK 中提供的那些分析工具。比如,NVIDIA Visual Profile。这是一款多平台的工具。它能指出在我们内核中哪些是错误的,并告诉我们该如何改进。        (2)、Parallel Nsight    

2016-10-31 16:33:46 1138

转载 CUDA 学习(二十)、优化策略5: 算法

一、概述       如果要考虑算法,我们需要先思考如下问题:      (1)、如何将问题分解成块或片,然后如何将这些块分解成线程;      (2)、线程如何访问数据以及产生什么样的内存模式;      (3)、算法总共要执行多少工作以及串行化的实现方法有何显著不同;二、排序        可用的排序算法有很多,其中有一些可以轻松、高效地在GPU 上实现,但也有

2016-10-31 15:08:43 747

转载 CUDA 学习(十九)、优化策略4:线程使用、计算和分支

一、线程内存模式        把应用程序分解成大小合适的网格、线程块和线程,是保证CUDA 内核性能的关键环节之一。包括GPU在内的几乎所有的计算机设计,内存都是瓶颈。线程布局的一个糟糕的选择通常也会导致一个明显影响性能的内存模式。

2016-10-31 14:29:29 1918

转载 CUDA 学习(十八)、优化策略3:传输

一、锁页内存        主机内存有较大数量的锁页内存。锁页内存允许GPU上的DMA(直接内存访问)控制器请求主机内存传输而不需要CPU主机处理器的参与。因此,在管理传输或从磁盘将换出的页面调回时,没有加载操作需要劳烦主机处理器处理。         在GPU上分配的内存默认情况下为锁页内存,这只是因为GPU不支持将内存交换到磁盘上。我们关心的是在主机处理器上如何分配锁页内存。为了分配锁

2016-10-28 18:25:17 1898

转载 CUDA 学习(十七)、优化策略2:内存因素

一、内存带宽       内存带宽和延迟是所有应用程序都要考虑的关键因素,尤其是GPU应用程序。带宽是指与某个给定目标之间传输的数据量。在GPU的情况下,我们主要关心的是全局内存带宽。延迟则是操作完成所用的时间。       GPU上的内存延迟设计为由运行在其他线程束中的线程所隐藏。当线程束访问的内存位置不可用时,硬件向内存提交一次读或者写请求。如果同一线程束上其他线程访问的是相邻内存位置

2016-10-28 16:06:08 2154

转载 CUDA 学习(十六)、优化策略1:并行/串行在GPU/ CPU 上的问题分解

一、问题分解       这里的基本议题是:这个问题可以被分解成并行运行的组块吗?也就是,是否有机会发掘出问题中的并发性?假设能够把问题分为多个并发快,那接下来的问题是有多少个并发块?CPU并行化的一个主要限制因素经常是没有足够大粒度(或粗粒度)的并行工作要做。GPU运行成千上万的程序,所有问题需要被分解成上千个块,而不是像CPU那样只执行少数并发任务。问题的分解应该总是从数据开始,考虑执行的

2016-10-28 14:10:27 1873

转载 CUDA 学习(十五)、应用程序性能优化

一、优化策略        针对程序的性能优化,有以下7个策略:       策略1:理解问题,并正确分解为串行/ 并行的工作负载。       策略2:理解并优化内存带宽、延迟和缓存使用的问题。       策略3:理解与主机端传输数据的玄机。考查锁页内存、零复制内存的表现和某些和某些硬件的带宽限制。       策略4:理解线程结构和计算能力,并了解它们对性能的影响方式。

2016-10-28 10:55:56 702

转载 CUDA 学习(十四)、纹理内存

一、概述        使用纹理内存主要基于以下两个目的:(1)计算能力为1.x 与3.x 硬件上的缓存机制;(2)基于硬件的内存读取操作。二、纹理缓存       由于在计算能力为1.x 的硬件上根本没有高速缓存,因此,每个SM上的 6-8KB 的纹理内存为此设备提供了唯一真正缓存数据的方法。然而,随着费米架构的硬件出现,一级缓存最大可达到48KB,共享二级缓存最大可达到76

2016-10-27 18:12:39 1281

转载 CUDA 学习(十三)、全局内存

一、概述GPU的全局内存之所以是全局的,主要是因为GPU与CPU都可以对它进行写操作。任何设备都可以通过PCI-E总线对其进行访问。GPU之间不通过CPU,直接将数据从一块GPU卡上的数据传输到另一个GPU卡上。

2016-10-27 17:23:47 1370

转载 CUDA 学习(十二)、常量内存

一、概述       常量内存其实只是全局内存的一种虚拟地址形式,并没有特殊保留的常量内存块。常量内存有两个特征,一个是高速缓存,另一个是它支持将单个值广播到线程束中的每个线程。       常量内存,通过名字我们就能猜到它是只读内存。这种类型的内存要么是在编译时声明为只读内存,要么是在运行时通过主机端定义为只读内存。常量只是从GPU内存的角度而言。常量内存大小被限制为64K。    

2016-10-26 17:20:59 2513

转载 CUDA 学习(十一)、共享内存

一、概述       共享内存实际上是可受用户控制的一级缓存。每个SM 中的一级缓存与共享内存一个64KB 的内存段。在开普勒架构的设备中,根据应用程序的需要,每个线程可以配置为16KB 的一级缓存或共享内存。而在费米架构的设备中,可以根据喜好选择16KB 或 48 KB 的一级缓存或共享内存。早期的费米架构的硬件(计算能力为1.x)中只有固定的16KB 共享内存而没有一级缓存。共享内存的延迟

2016-10-26 15:52:45 1137

转载 CUDA 学习(十)、寄存器用法

一、映射寄存器方式        CPU与GPU架构的一个主要区别就是CPU与GPU映射寄存器的方式。CPU通过使用寄存器重命名和栈来执行多线程。为了运行一个新的任务,CPU需要进行上下文切换,将当前所有寄存器的状态保存到栈(系统内存)上,然后从栈恢复当前需要执行的新线程上次的执行状态。这些操作通常需要花费上百个CPU时钟周期。如果在CPU上开启过多的线程,时间几乎都将花费在上下文切换过程中寄

2016-10-26 14:00:14 5836

转载 CUDA 学习(九)、CUDA 内存

一、CPU内存       在传统的CPU模型中,内存是线性内存或平面内存,单个CPU核可以无约束地访问任何地址内存。在内存处理中有两个重要的概念,一个是存储带宽,即在一定时间内从DRAM 读出或写入的数据量。另一个是延迟,即响应一个获取内存的请求所花费的时间,通常这个时间会是上百个处理器周期。二、高速缓存       高速缓存是硬件上非常接近处理器核的高速存储器组。高速缓存的

2016-10-26 10:46:52 1247

转载 CUDA 学习(八)、线程块调度

一、调度       如果我们有19个线程块和4个SM,将所有的线程都分配到一个SM上进行处理,显然不够合理。如果让前3个SM每个处理6个线程块,最后一个SM处理一个线程块,那么最后一个线程块就会很快处理完,然后SM会闲置。这样做设备的利用率会很低。       如果我们用轮流交替的方式将线程块分配到SM 中,每个SM处理4个线程块(4*4=16 个线程块),还剩下三个线程单独用一个SM

2016-10-25 17:54:30 2423

转载 CUDA 学习(七)、线程束

一、概述       线程束是GPU的基本执行单元。GPU是一组SIMD 向量处理器的集合。每一组线程或线程束中的线程同时执行。在理想状态下,获取当前指令只需要一次访存,然后将指令广播到这个线程所占用的所有SP中。      当使用GPU进行编程时,必须使用向量类型指令,因为GPU采用的是向量体系结构,只有让代码在成千上万个线程上运行才能充分高效利用GPU的资源。      当前,GP

2016-10-25 17:35:01 3733

转载 CUDA 学习(六)、线程网格

一、概述       一个线程网格是由若干线程块组成的,每个线程块是二维、三维的,拥有X轴、Y轴、Z轴。此时,每次最多能开启Y*X*Z*T 个线程。       通常线程块中线程数量最好是一个线程束大小的整数倍,即32 的整数倍。由于设备是整个线程束为单位进行调度,如果我们不把线程块上的线程数目设成32的整数倍,则最后一个线程束中有一部分线程是没有用的,因此我们必须设置一个限制条件进行限制

2016-10-25 16:36:02 4163

转载 CUDA 学习(五)、线程块

一、概述        在GPU编程上,通常我们可能会创建成千上万个并发线程来实现设备上的高吞吐量。例如:                     这将会调用名为 some_kernel_func 的GPU函数共 2*128 次,每次都是不同的线程。然而,这样做通常会使 thread_idx 参数的计算变得更加复杂,而 thread_idx 通常又用来表示数组的下标。因此,内核函数如下

2016-10-25 14:46:18 2107

转载 CUDA 学习(四)、线程

一、概述       英伟达的硬件调度是采用SPMD(单程序多数据),属于SIMD(单指令多数据)的一种变体。线程是并行程序的基本构建块。二、CPU与GPU的差异       GPU和CPU设备的架构是迥异的。CPU的设计是用来运行少量比较复杂的任务。GPU的设计则是用来运行大量比较简单的任务。CPU的设计主要是针对大量离散而不相关任务系统。而GPU的设计主要是针对解决那些可以

2016-10-25 14:16:32 1423

原创 GeForce GTX 970 硬件特性

GeForec GTX 970 具有特性:SM(流处理器簇): 13     其中每个SM 有128个核,即:13*128=1664个核

2016-10-24 16:12:56 599

转载 CUDA 学习(三)、CUDA硬件概述

一、PC架构        先看一下酷睿架构图:                              PCI-E 是一个有意思的总线。与其上一代PCI(外围设备互连)总线不同,PCI-E提供一个确定的带宽。在原先的PCI系统中,每个设备都可以使用总线的全部带宽,但一次只能让一个设备使用。因此,你增加的PCI卡越多,每个卡能够获得的可用带宽就越少。PCI-E总线通过引入PCI-E通

2016-10-24 14:55:03 2286

转载 CUDA 学习(二)、使用GPU理解并行计算

一、并发性       由于“易并行”不需要或者只需要少许线程间或线程块间通信,所以CUDA是很理想的并行求解平台。它用基于片上资源的、显式的通信原语来支持线程间通信。

2016-10-24 11:40:45 5132

转载 CUDA 学习(一)、超级计算机介绍

一、概述       超级计算式我们在现代处理器中看到的许多技术的发展动力。超级计算机和桌面计算正向着异构计算发展,人们试图将中央处理器(CPU)和图形处理器(GPU)技术混合在一起来实现更高的性能。二、冯. 诺依曼计算机架构        在冯. 诺依曼计算机架构中,处理器从存储器中取出指令、解码、然后执行指令。内存速度和时钟速度的比例是限制CUP和GPU 吞吐量的一个重要因素。下图

2016-10-21 17:58:19 923

原创 OpenCV 命名空间 using namespace

在OpenCV中使用 using namespace cv 的作用:     在使用#include语句包含相应头文件后,使用下面语句即可包含相应的Opencv命名空间      using namespace cv;       如果没有这个语句,那么在这个命名空间的相关资源就需要带上cv前缀,如cv::Mat,表示的是使用命名空间cv中的Mat;而有了using namespa

2016-10-21 14:45:02 9735 3

原创 OpenCV_CUDA 中GpuMat数据结构

一 、GUPMat 概述     在使用OpenCV_CUDA 编程中会遇到GpuMat数据结构,该数据结构是GPU内存容器。         在GUP中,类GpuMat是存储2D数据。类GpuMat 的特点:(1)它的数据不是连续的,在每一行末尾额外填充数据;(2)它包含下面数据项:     --data: GPU内存指针数据开始;     --step:距离之间的数据是两个连续

2016-10-21 14:34:53 9184

原创 CMake 常用命令解析

参考:http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html一、常用命令解析1、CMAKE_MINIMUM_REQUIRED(VERSION 2.8)     #CMake 最低版本要求,低于2.8 构建构过程会被终止2、PROJECT(gpuMat)     #定义工程名称

2016-10-21 11:42:22 8289

原创 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 4128

原创 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 1341

原创 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 10122

原创 VS2013 配置OpenCV3.1

一、环境:Windows10家庭版 64位 Virtual Stadio 2013 OpenCV 3.1 二、配置VS的项目属性(1)选择X64

2016-10-19 09:30:48 586

原创 OpenCV3.1-OpenCL的使用

参考:http://opencv.org/platforms/opencl.html一、OpenCV-2.x 和 OpenCV-3.x使用区别OpenCL-aware code OpenCV-2.x// initializationVideoCapture vcap(...);ocl::OclCascadeClassifier fd("haar_ff.xml

2016-10-18 17:47:51 6083 5

原创 Source Insight 使用

一、工程建立

2016-07-28 17:16:17 1983

转载 Makefile (十二) wildcard 用法

在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...)。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开

2016-07-22 15:49:31 556

转载 Makefile (十一) 使用make 更新函数库文件

函数库文件也就是对 Object 文件(程序编译的中间文件)的打包文件。在 Unix 下,一般是由命令"ar"来完成打包工作。一、函数库文件的成员        一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:  archive(member) 。这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了"ar"命令来服务的。如:        

2016-07-22 09:46:07 342

转载 Makefile (十) 隐含规则

在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译 C/C++的源程序为中间目标文件(Unix 下是[.o]文件,Windows 下是[.obj]文件)。本章讲述的就是一些在 Makefile 中的“隐含的”,早先约定了的,不需要我们再写出来的规则。      “隐含规则”也就是一种惯例,make 会按照这种“惯例”心照不喧地来运行,那怕我们的 M

2016-07-22 09:37:03 364

转载 Makefile (九) make 的运行

一般来说,最简单的就是直接在命令行下输入 make 命令,make 命令会找当前目录的makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候我们有几套编译规则,我们想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用 make 命令的。一、make 的退出码       make 命令执行后有三个退出码:    

2016-07-21 16:13:19 367

空空如也

空空如也

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

TA关注的人

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