CUDA加速为什么没有并行的效果

我对一幅图像做处理,640X480,对每个像素我分配了一个thread,即我每个block分配了640个thread,分配了480
个block。然后我对另一幅2048X1536的图像操作,我每个block分配了1024个thread,共分配了1536X2个block。用
同样的算法,问题规模增加了10倍,我不理解的是为什么运行时间也增加了10倍。不是只会增加一点读取数据的时间吗。
对CUDA的运行原理不是很了解,忘大神指教。图片说明

0

3个回答

关于为什么线程不能这么多的问题,我说的不是很清楚,我再补充一下,支持CUDA的NVIDIA 显卡,都是由多个multiprocessors 组成。每个 multiprocessor 里包含了8个stream processors,其组成是四个四个一组,也就是两组4D的处理器。

每个 multiprocessor 还具有 很多个(比如8192个)寄存器,一定的(比如16KB) share memory,以及 texture cache 和 constant cache

在 CUDA 中,大部份基本的运算动作,都可以由 stream processor 进行。每个 stream processor 都包含一个 FMA(fused-multiply-add)单元,可以进行一个乘法和一个加法。比较复杂的运算则会需要比较长的时间。

在执行 CUDA 程序的时候,每个 stream processor 就是对应一个 thread。每个 multiprocessor 则对应一个 block。但是我们一个block往往有很大量的线程,题主用到了640个和1024个,远超一个 multiprocessor 所有的8个 stream processor 。

实际上,虽然一个 multiprocessor 只有八个 stream processor,但是由于 stream processor 进行各种运算都有 latency,更不用提内存存取的 latency,因此 CUDA 在执行程序的时候,是以warp 为单位。

比如一个 warp 里面有 32 个 threads,分成两组 16 threads 的 half-warp。由于 stream processor 的运算至少有 4 cycles 的 latency,因此对一个 4D 的stream processors 来说,一次至少执行 16 个 threads(即 half-warp)才能有效隐藏各种运算的 latency。也因此,线程数达到隐藏各种latency的程度后,之后数量的提升就没有太大的作用了。

还有一个重要的原因是,由于 multiprocessor 中并没有太多别的内存,因此每个 thread 的状态都是直接保存在multiprocessor 的寄存器中。所以,如果一个 multiprocessor 同时有愈多的 thread 要执行,就会需要愈多的寄存器空间。例如,假设一个 block 里面有 256 个 threads,每个 thread 用到20 个寄存器,那么总共就需要 256x20 = 5,120 个寄存器才能保存每个 thread 的状态。

而一般每个 multiprocessor 只有 8,192 个寄存器,因此,如果每个 thread 使用到16 个寄存器,那就表示一个 multiprocessor 的寄存器同时最多只能维持 512 个 thread 的执行。如果同时进行的 thread 数目超过这个数字,那么就会需要把一部份的数据储存在显卡内存中,就会降低执行的效率了。

2

CUDA编程的优化可不只是一味增加线程,线程增加到一定程度就不能加速了,反而会越来越慢,因为实际上GPU的处理单元还是有限的,增大线程只能在一定程度上隐藏global memory的latency,题主最好去系统学一下CUDA,不然写出来的程序是比较差的,常规的优化方法还有非常多,要想优化好一个CUDA程序,首先要设计比较合理的并行算法,举个例子来说树状加法并行就会比正常相加快很多,第一步是首先尽量优化内存带宽,因为内存带宽一般是程序的瓶颈,GPU相比CPU的一大优势就在于有非常大的内存带宽,有的能到150GB/s,这里面不单单是线程,比如考虑访问global内存的顺序,如果是顺序访问内存,而不是跳跃访问,大概会有3-8倍的加速,在线程方面使用基本没有latency的share memory 也是一个加速的手段,优化好内存带宽之后还有很多的优化技术,比如优化指令流,在误差可接受的情况下,使用CUDA算术指令集中的快速指令,避免多余的同步,资源均衡,与主机通信优化,尽量减少CPU与GPU间的传输,使用流和异步处理隐藏与主机的通信时间;使用zero-memory技术和Write-Combined memory提高可用带宽等等,所以建议去系统学一下,还是很有学问的~

1

数据上传下载也要开销的,主要看看代码咋写的才好说

0
oYangZi12
oYangZi12 我看了下传数据的时间几乎可以忽略
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
CUDA进阶第五篇-如何估算出程序的GPU加速比
当对一个程序进行加速的时候,很多时候需要预估出程序使用GPU加速后的加速比(比如你老板不懂GPU,或者甲方会问你预估加速比等等)。从大二接触GPU加速,到现在大概有6年时间,大大小小的项目也做了十几个,很多时候都需要事先回答加速比会有多少这个问题。这里简单的说一下自己的经验,欢迎各位大神指点。 文中的经验基于目前主流的显卡,比如GTX1080,最低也得是GTX9**系列的。 1.阿姆达尔定律 ...
Kmeans 的 CUDA 并行实现
1. Kmeans 步骤常规的 Kmeans 步骤: 1. 初始化聚类中心 2. 迭代 1. 计算每个样本与聚类中心的欧式距离 2. 根据样本与聚类中心的欧式距离更新每个样本的类标签 3. 根据类标签更新聚类中心本文中并行化的 Kmeans 的步骤: 初始化每个样本的类标签 迭代 统计每一类的样本和 统计每一类的样本个数 计算每一类的聚类中心:样本和 / 样本个数
CUDA下四重循环两种并行方式效率分析
1 问题描述 原代码:for(int m=0;m                      for(intn=0;n                             for(inti=0;i                                    for(intj=0;j                                    {
CUDA 高性能并行计算入门
CUDA 高性能并行计算入门 (UPDATE IN 2018.3.8) 1.更新pitch索引操作的描述 概述 什么是CUDA? CUDA(Compute Unified Device Architecture)是 NVIDIA公司开发的一种计算架构,可以利用NVIDIA系列显卡对一些复杂的计算进行并行加速。 为什么要用CUDA加速? 在科学计算领域所要用到的计算往往不是我们熟知的...
基于Cuda的几种并行稀疏矩阵乘法方法(一)
最近由于研究需要和兴趣看了很多稀疏矩阵乘法的算法,这方面的研究千奇百怪,研究人员真的是十八般武艺全都用上了,好吧,就让我来说说这个东西吧,由于这个东西实在方法太多,所以请容许我一节一节地去完善。   1、存储方式   稀疏矩阵的存储方式真的非常多,也各有千秋,它们包括CSR(许多库的首选存储方式),COO(MATLAB存储稀疏矩阵的方式),CSC(这个也可以看成是CSR,做个转置就完了),ELL
安装带有Kinfu和GPU并行运算版本的PCL
这几天看到kinect fusion 的效果后,对其非常感兴趣,于是也想搭建一个kinect fusion 的框架自己玩玩,无奈PCL中kinfu的开源代码一直是测试版本,并没有release发布版,于是只能默默的卸载之前安装的1.7.1版本换上PCL的测试版本。   Pcl的测试版本同样可以在github主页上下载,只要选中首页的master分支,并download into ZIP即可,kin
并行加速实战 双边滤波器
之前分析了 二维中值滤波器的并行加速 由于二维中值滤波器是控制密集型的滤波器(排序操作),所以SSE加速不太明显 这次选用了计算密集型的双边滤波器 针对双边滤波器在5*5的滤波核下的运算速度做优化和分析 以下会有主区域、全图、主循环、完整(初始化+主循环)的概念 1.     由于双边滤波的滤波半径为2+1,所以不能忽略图像四周边界的区域了。 所以,以下会对主区
CUDA硬件加速的理解
李国帅 从网络收集的内容并整理2012/7/31 9:05:27概念CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用C语言来为CUDA架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序于是就可以在支持CUDA的处理器上以超高性能运行。将来还会支持其它语言
如何使用CUDA达到加速程序
from:http://www.cnblogs.com/viviman/archive/2012/11/28/2792521.html 1 block内的thread我们是都饱和使用吗? 答:不要,一般来说,我们开128或256个线程,二维的话就是16*16。 2 grid内一般用几个block呢? 答:牛人告诉我,一般来说是你的流处理器的4倍以上,这样效率最高。
CUDA实现的直方图均衡化算法
CUDA实现的直方图均衡化算法因做毕设接触到CUDA这个东西,于是就开始了一段漫长的学习CUDA的过程!关于直方图均衡化算法,也是一时兴起想实现一下。最开始是看CUDA的samples里面有一个histogram64和histogram256的计算直方图的算法,啃了半天它的源代码和英文的pdf文档,有些费劲,而且源代码较为复杂,并不是直接读入图片进行均衡化处理,对初学者来说并不是很建议上来就看它。
CUDA性能调优(二)—并行规约及优化
1  并行规约的适用对象 通常用于处理大输入数据集,将一组输入值规约一个值。 数据特点: (1)对于数据集中的元素没有顺序要求。 (2)可将数据分为若干小集合,每个线程处理一个集合。 操作可以是:求最大值(Max)、求最小值(Min)、求和(Sum)、连乘(Product)。 2  并行规约的实现方法 并行规约的两种方法,由于第一种方案存在着线程分支,所以这里不再讨论
用openMP进行并行加速
最近在看多核编程。简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生。按照我的理解,多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率。这两天关注的多核编程的工具包括openMP和TBB。按照目前网上的讨论,
基于CUDA的并行lammps编译及测试
运行环境:Centos 5.8 Final             Cuda 5驱动及Toolkit             Lammps-16Nov12 fftw-2.1.5 openmpi-1.4.5   硬件环境:Intel XEON E5 2640            128GB DDR3 1600 ECC            WD 1TB HDD          
利用GPU并行计算来加速简单积分过程的实验
由于CPU的摩尔定律已经不再适用,目前加速程序的最佳选择就是通过GPU并行。经过几天的摸索后,完成了这个利用GPU加速积分算法的小实验。 数值积分中最常用的方法之一就是辛普森积分法,首先我们写出一段三阶辛普森积分的小程序: double Simpson_integ (int n_steps, double a, double b, double (*func)( double t)) { ...
利用cuda加速卷积神经网络,用于人工智能图像分类
利用cuda加速卷积神经网络,用于人工智能图像分类,利用cuda加速卷积神经网络,用于人工智能图像分类
CUDA编程(九)并行矩阵乘法
CUDA编程(九)矩阵乘法 在之前我们一直围绕着一个非常简单的求立方和的小程序学习CUDA,不过这个立方和的小程序没有什么实际意义,这篇博客我们用CUDA并行了矩阵乘法,问题也比较简单,基于上一个立方和程序的经验,完成这个程序也不算太难,但是运行结果存在很多问题,毕竟我们还没有开始优化,不过除了速度问题,GPU浮点数运算的精度也成了一个大问题,不过这些之后都会慢慢解决。
OpenMp 程序优化,怎么让并行达到并行的效果!
参考链接:http://blog.csdn.net/donhao/article/details/5651156 常用的库函数 函数原型                                        功能 int omp_get_num_procs(void)     返回当前可用的处理器个数 int omp_get_num_threads(void)  返回当前并
CUDA学习二:CUDA C并行编程
个博客中我们了解到了在函数前面加_ _global_ _修饰符来定义核函数并通过一个尖括号来调用就可以在GPU上执行这个函数的功能。方法简单但是低效,因为经过优化的图形处理器可以并行执行数百次的运算,然而在实例中只调用一个核函数且是串行执行。下面来了解运算的并行性。1、矢量求和运算  矢量的求和运算,这里对运算的模型进行简单化,就理解成两个数组对应下标的数据元素相加,并将结果保存到第三个数组中。1.
CUDA矩阵BLAS效率
以前曾听说cublas的效率不是很高, 今天写了个小程序对cublas的矩阵乘法速度进行了一个测试, 发现结果并非如此. 至少就矩阵乘法来说,cublas的效率很不错, 相对CPU有非常高的加速比.测试程序是在sdk例子simpleCUBLAS的基础上修改而成, 测试内容是分别用cublas和CPU函数计算两个N阶矩阵A和B的乘积, 然后对结果进行校验,并计算各自的flops.(每个矩阵元素加乘看
【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结
2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用。Video Codec SDK包含完整的的高性能工具、源码及文档,支持,可以运行在Windows和Linux系统之上。从软件上来说,SDK包含两类硬件加速接口,用于编码加速的NVENCODE API和用于解码加速的NVDE
为何GPU可以用于加速人工智能或者机器学习的计算速度(并行计算能力)
一、Why GPU 其实GPU计算比CPU并不是“效果好”,而是“速度快”。 计算就是计算,数学上都是一样的,1+1用什么算都是2,CPU算神经网络也是可以的,算出来的神经网络放到实际应用中效果也很好,只不过速度会很慢罢了。 GPU的起源 GPU全称叫做graphics processing unit,图形处理器,顾名思义就是处理图形的。 电脑显示器上显示的图像,在显示在显示器上之前,要...
使用cuda对for循环进行并行的小例子
#include <iostream> #include <fstream> using namespace std; #include <cuda_runtime.h> __global__ void GetImage(int* imagedata,const int nx, const int ny,int tempj){ int i = thr...
CUDA并行规约(交错配对)
按照前文多线程的交错配对方式实现并行规约求和方式,实现CUDA版本的并行规约求和,由于这种方式的规约可以避免线程束的分化,因此不需要进行类似于相邻配对那种方式的优化。 交错与优化相邻模式相比,计算效率提升到1.14倍,性能提高有限,这主要受限于全局内存的加载和存储模式。 并行规约的示意图:  #include "cuda_runtime.h" #include "device_lau
关于CUDA实现DBSCAN的并行化
 实验环境:Windows10 + VS2015 CPU:i7-6700HQ 2.6GHz GPU:NVIDIA GTX965M DBSCAN算法介绍               DBSCAN(Density-BasedSpatial Clustering of Applications with Noise)是一个比较有代表性的基      于密度的聚类算法。与划分和层次聚类方法不同,它...
连通域标记的GPU并行算法——基于CUDA方法
串行程序连通域:连通域标记是图像处理中常用的预处理方法,在机器视觉、目标检测跟踪中几乎都要用到。一个例子:主动反狙击探测猫眼效应↓瞄准镜目标↓检测标记↓有很多种标记算法,其中一种↓原理描述:数据输入:从文件中读取图像数据,记为D初始化:开辟与图像尺寸相同的数据空间,对每个像素顺序标号,生成标号矩阵L处理:对于L中的每一个像素p,首先根据D矩阵判断领域像素是否连通,然后搜寻连通邻域内的最小值v_mi...
GPU并行使用Fortran
运用Fortran在GPU上进行并行分析处理的资料
CUDA编程(六)进一步并行
CUDA编程(六)进一步并行 在上一篇博客中给大家介绍了一个访存方面非常重要的优化,我们通过使用连续的内存存取模式,取得了令人满意的优化效果,最终内存带宽也达到了GB/s的级别。之前也已经提到过了,CUDA不仅提供了Thread,还提供了Grid和Block,本篇博客通过使用block进行了进一步的并行,得到了比较令人满意的结果
【并行计算-CUDA开发】GPU并行编程方法
转载自:http://blog.sina.com.cn/s/blog_a43b3cf2010157ph.html 编写利用GPU加速的并行程序有多种方法,归纳起来有三种: 1.      利用现有的GPU函数库。 Nvidia 的CUDA工具箱中提高了免费的GPU加速的快速傅里叶变换(FFT)、基本线性代数子程序(BLAST)、图像与视频处理库(NPP)。用户只要把源代码中CPU版本
caffe使用cuda速度只比cpu快了2倍?
今天终于吧caffe配好了,迫不及待的测试了两个例子: 一个是caffe自带的mnist例子。 另一个是网上有人改了caffe的例子cpp_classification,功能是识别猫。 配的比较困难,因为用到了opencv、boost和cuda的各种库,最终终于配好了。下面是测试数据(图像大小216kb),跑多次程序,提速基本保持在1.5-2倍 CPU_ONLY=1 -------
cuda实现中值滤波
.cu文件#include "MedianBlur.h" #include "cuda_runtime.h" #include "device_launch_parameters.h" typedef unsigned char uchar; const unsigned int BLOCK_W = 8; const unsigned int BLOCK_H = 8; __global__...
使用numba加速python
我们都知道 Python 比较慢,但很多时候我们都不知道为什么。虽然我用 Python 也有那么两年左右了,但也只能模模糊糊地感受到这么两点: * Python 太动态了 * 如果能事先编译一下 Python,让它静态一点,速度应该就会上来 于是我们就有了 cython。然而 cython 毕竟不是原生的 Python 代码,使用起来还是有诸多不便的。为此,numba 就成了一个
《基于CUDA的并行程序设计》学习笔记(一)
第1章 并行计算概述1.1 并行计算简介对于计算机而言,“并行”就是同一时间间隔内,增加操作量,多个运算部件共同完成一个任务。并行计算(parallel computing)就是由运行在多个部件上的小任务合作来求解一个大规模计算问题的一种方法。 在科学计算领域,待求解问题的规模也越来越大,采用并行计算可以降低单个问题求解的时间,增加问题求解规模,提高问题求解精度,改善多机同时执行多个串行程序的容错
CUDA硬件运行的大致原理
并发与并行的区别:“并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。 而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 从以上本质不难看出,“并发”执行...
GPU加速的orb算法例程
ORB算法算是OpenCV自己提出来的算法 所以不管是C++还是CUDA代码在OpenCV里面都是有的 今天测试一下ORB算法以及使用GPU加速的ORB算法,其实代码很类似,只是接口的转换而已
C++ AMP 加速大规模并行计算-GPU和CPU的性能比较
比较一下CPU和GPU的通用计算能力,我的显卡是AMD的,没法使用CUDA……前段时间尝鲜Win8,顺便就下载了一个Visual Studio 11 Beta,发现里面有一个C++ AMP,拿来比较一下。根据目前的资料,只要显卡支持DirectX 11就可以使用 C++ AMP,就是将代码编译成x86和HLSL       比赛的方法是准备一个10000个32位浮点数,对每个浮点数做100000次
CUDA和OpenCV图像并行处理方法研究
CUDA和OpenCV图像并行处理方法研究,希望对研究并行计算的朋友们有帮助!
CUDA流-数据复制与核函数执行并行
http://blog.csdn.net/u010335328/article/details/52453499 1. CUDA流介绍 CUDA流在加速应用程序方面起着重要的作用。CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行。我们可以在流中添加一些操作,如核函数启动,内存复制等。将这些操作添加到流的顺序也就是他们的执行顺序。你可以将每个流视为GPU上的一个任务,并且这
CUDA加速计算项目采坑总结
CUDA加速运算项目采坑总结 本篇博客主要记录研一上期末考试后,完成CUDA加速计算项目(C++)的采坑旅程。 1.Nsight5.2 BUG 不支持gtx1050和gtx1050Ti Nsight是N厂开发用来配合Visual Studio调试GPU(device端)内存的插件。这个BUG,NVIDIA负全责。Nsight一般会随cuda的安装配套安装(我的cuda是8.0,配套N...
Jacobi算法的CUDA改造GPU并行加速
Jacobi算法的CUDA改造GPU并行加速
CNN在应用中,为什么GPU可以有加速效果
CNN在应用中,一般采用GPU加速,请解释为什么GPU可以有加速效果,主要加速算法的哪一个部分? 这里默认gpu加速是指NVIDIA的cuda加速。CPU是中央处理单元,gpu是图形处理单元,gpu由上千个流处理器(core)作为运算器。执行采用单指令多线程(SIMT)模式。相比于单核CPU(向量机)流水线式的串行操作,虽然gpu单个core计算能力很弱,但是通过大量线程进行同时计算,在数据量很
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 为什么高校课程没有nlp python深度学习cuda