CUDA编程
i_chaoren
这个作者很懒,什么都没留下…
展开
-
CUDA编程—硬件基础
1、梳理概念:sp,sm,thread,block,grid,warp(1)硬件上, SP(streamingProcess),SM(streaming multiprocessor)。● SP:最基本的处理单元,也称为CUDA core。CUDA Core是NVIDIA在推出全新的Fermi架构后才出现的一个名词。简单的说,CUDA Core就是以前所说的流处理器,是类似的东西,只是名原创 2017-03-10 11:18:11 · 813 阅读 · 0 评论 -
CUDA性能调优(二)—并行规约及优化
1 并行规约的适用对象通常用于处理大输入数据集,将一组输入值规约一个值。数据特点:(1)对于数据集中的元素没有顺序要求。(2)可将数据分为若干小集合,每个线程处理一个集合。操作可以是:求最大值(Max)、求最小值(Min)、求和(Sum)、连乘(Product)。2 并行规约的实现方法并行规约的两种方法,由于第一种方案存在着线程分支,所以这里不再讨论原创 2017-03-25 16:18:15 · 6484 阅读 · 1 评论 -
CUDA卷积操作—使用constant memory实现高斯滤波
高斯滤波就是使用高斯模板和图片进行卷积运算,高斯函数及模板如下图所示:卷积前后的效果图如下:GPU代码如下所示:#include "cuda_runtime.h"#include "device_launch_parameters.h"#include #include "Windows.h"#include #includeusing names原创 2017-04-24 22:00:12 · 6705 阅读 · 3 评论 -
CUDA大津阈值—原子加统计直方图&规约求最大值索引
在大津阈值的CUDA实现中有三个需要注意的地方:(1)使用atomicAdd操作实现直方图的统计;atomicAdd简介:原子操作一般要实现读取-修改-写入三个步骤,并且在执行过程中不会被打断。即除非已经完成了这三个操作,否则其他线程都不能读取或写入x的值。在计算直方图时,存在一个问题,多个线程可能对输出直方图的同一元素进行递增,这时候我们需要使用原子操作完成。(2)借助share原创 2017-04-24 22:34:13 · 1870 阅读 · 0 评论 -
VS中CUDA版本升级
如果一个VS的工程中,CUDA的版本是5.5,由于某种原因现在需要将该版本升级到7.5,或者其他高版本,只需要修改对应的工程文件即可。假设工程的名叫:Vision具体操作如下:(1) 正确安装需要升级的高版本CUDA,不需要卸载低版本,如果以后用不到低版本,则可以卸载。这里是否卸载低版本对升级没有影响。(2) 找到对应的工程文件,文件名为:Vision.vcxproj(3) 用原创 2017-08-22 22:19:31 · 2201 阅读 · 2 评论 -
CUDA中Block大小的选择
这里介绍两种比较官方的做法,这两种做法的原理是一致的,都是基于SM占用率最大化的原则。API函数--cudaOccupancyMaxPotentialBlockSize从CUDA6.5开始,提供了一个很有用的函数cudaOccupancyMaxPotentialBlockSize,该函数定义在cuda_runtime.h,定义如下: 注意:对于二维数据,根据计算出的blocks原创 2017-09-24 17:46:03 · 14140 阅读 · 0 评论 -
CUDA性能调优(一)--合并访问&循环展开
当同一个warp中的所有线程都执行同一条指令访问全局存储器中的单元时,就获得最有利的访问模式。这种情况下,硬件把所有的这些访问结合或者合并成一个队DRAM连续单元的合并访问。合并访问可以提高DRAM的带宽利用率,使DRAM在传输数据时的速度接近全局存储器带宽的峰值。示例如下:1 在普通GPU矩阵相乘中的两种访问模式2 在使用shared memory的矩阵相乘中,使原创 2017-03-25 00:19:06 · 5708 阅读 · 0 评论 -
CUDA编程—通过shared memory优化矩阵相乘
使用shared memory带来两点优化:(1)使用共享存储器减少了线程块中的线程必须访问的数据总量。(2)使用共享存储器来实现存储空间的合并。(下篇文章展开介绍)原创 2017-03-10 21:39:50 · 7593 阅读 · 3 评论 -
CUDA内存--纹理内存的说明与使用
纹理介绍 纹理存储器(texture memory)是一种只读存储器,由GPU用于纹理渲染的的图形专用单元发展而来,因此也提供了一些特殊功能。 纹理缓存的优势:纹理缓存具备硬件插值特性,可以实现最近邻插值和线性插值。纹理缓存针对二维空间的局部性访问进行了优化,所以通过纹理缓存访问二维矩阵的邻域会获得加速。纹理缓存不需要满足全局内存的合并访问条件。 纹理可以是一段原创 2017-09-22 11:48:58 · 8017 阅读 · 1 评论