简单介绍CUDA中loop unrolling(循环展开)技术_rs勿忘初心的博客-程序员秘密

技术标签: CUDA  loop unrolling  循环展开  

参考:http://blog.csdn.net/canhui_wang/article/details/52919318

 loop unrolling 不同于内存优化(hardware accessing),这是一种指令级优化(software programming)。如果说编程上For循环是一种以计算性能的打折作为代价来实现编程的简单化的编程思路,那么Loop unrolling将是一种以编程复杂为代价来提升并行代码性能的高级的编程方式;更进一步地,For循环可以看成是loop unrolling零优化的状态;所以,计算性能loop unrolling严格优于或至少等于For语句——这是CPU,GPU的硬件的系统结构所致。

举例分析如下:

loop_unrolling.cpp

#include <iostream>
#include <windows.h>
#pragma comment(lib, "Winmm.lib")   //timeGetTime() 

using namespace std;

int main()
{
	int N = 10000000;
	DWORD start, end1,end2;
	start = timeGetTime();
	int *a = (int*)malloc(sizeof(int) * N);

	//传统实现
	for (int i = 0; i < N; i++) {
		a[i] = i*2;
	}
	end1 = timeGetTime();
	cout <<"传统实现时间:"<< (end1 - start) << " ms" << endl;


	//指令并行化
	for (int i = 0; i < N; i = i + 2) {
		a[i] = i * 2;
		a[i + 1] = (i + 1) * 2;
	}
	end2 = timeGetTime();
	cout << "指令并行化实现时间:"<< (end2 - end1) << " ms" << endl;

	return 0;
}

运行结果:


 Unrolling Loop可以进一步抽象出“并行粒度”的概念,比如,例子一中一个线程处理一个指令(任务轻),例子二中一个线程处理两个指令(任务重);另一方面,就CUDA而言,例子一需要的blocks数目少,例子二需要的blocks数目多。因为总体的性能是由线程执行时间与blocks数目决定的(线程计算能力范围内任务轻重耗时相近,计算能力外任务重耗时大;并行blocks能力范围内(比如NVIDIA GTX780Ti一次可并行192blcoks)blcoks的数目多数目少二者耗时相近),能力范围外,blocks数多点调度数目多点,耗时长点————总而言之,这是一个tradeoff问题,我们做的就是寻找一种策略在blocks块数目与线程处理时间之间的处理平衡,达到性能最大优化。


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_33718563/article/details/79262371

智能推荐

【转】vi/vim使用进阶: 目录_weixin_30339969的博客-程序员秘密

讲述的其实和软件开发关系并不大,基本都在讲vim的使用技巧、vim的配置及vimrc、vim的命令和vim的插件。包括:序言(讲述我使用vi/vim的经历和心得,以及对vi/vim初学者的一些建议)、使用会话和viminfo、vimrc初步、保存项目相关配置、 使用标签(tag)文件、使用taglist插件、文件浏览和缓冲区浏览、lookupfile插件、开启文件类型检测、 乱花渐欲迷人...

学习iBatis时的一个苦逼经历_chuqu7218的博客-程序员秘密

2012年8月6日 06:45:10这么早绝对不是想来印证这了一个职业段子:如果你看见一个程序员早上九点还在床上睡着,别去吵醒他,他刚睡不久;如果你在6点看见一个程序员在洗簌,别去理他,他一定是要准备睡觉。 显然现在的这个时间段我因该是属于后者,可是偏偏不是,今天早上...

从操作系统的角度 驳斥 杜车别的黑客帝国影评_杜车别 博客_BIAOBIAO齐的博客-程序员秘密

土人比较落后,直到前几天才看了黑客帝国 = =。真是很经典的片子,囊括了哲学和计算机科学。特别适合咱们程序员~其中许多思想都能真正跟AI对接吧~~或许以前看不会感触那么深,包括the Matrix系统中“杀毒软件”Smith的自我复制衍生为病毒,包括那个进程间通信的管道--火车站,这些专业知识,我想只有在学了操作系统以后才会深刻的激起共鸣~于是,如果各位是多年前还没接触编程

敢问路在何方?程序员转行应该卖水果还是卖烧饼_weixin_33913377的博客-程序员秘密

摘要:转行之后就能成为高富帅迎娶白富美?其实也未必,但是现在很多三十而立的程序员需要面对“职业转型”这个人生的有一大命题了,这个命题恐怕是我们走出大学校门选择了职业之后有一大人生抉择,“奔三”或者“而立之年”的你,对于职业选择,究竟该保持现状还是转变思路,这是一个问题。最近有两个关于程序员的新闻让不少IT人都欢乐了一把,微博上有人晒出了两个程序员转行之前和转行之后的对比照,这两位程序员哥...

lock free 之 stack_lockfree stack_redeyerabbit的博客-程序员秘密

第二个例子(和第一个一样,没加注释,均是消费者需要判断生产者还在生产 吗),在实际中,可以考虑使用这个模型,比起我前面写的数据队列来说,用boost::lockfree可以大大减轻工作,这也是今年要努力掌握boost的一个理由#include #include #include #include boost::atomic_int producer_count(0);boost::a

随便推点

【C/C++】C语言复习笔记-17种小算法-解决实际问题_Jlins的博客-程序员秘密

判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且输入月份大于3时需考虑多加一天 5 */ 6 7 /* 8 *@author: 成鹏致远 9 *@net: http://infodown.tap.cn

JLINK 调试报错 JLink Error: Can not read register 解决办法_langeldep的博客-程序员秘密

Keil5  JLINK调试报如下错误, 原因是JLINK的SW调试模式的频率太大了, 默认是2MHz, 修改为1MHz就好了。 另外是FLASH DOWNLOAD 里面要根据芯片的型号和FLASH的尺寸, 选择一个和你的芯片匹配的配置,默认是1M的FLASH,  我的芯片是512K的。另外还有一个要注意的地方就是,  你调试的时候, 设置了断点, 可能只能 watch 全局变量,

关于a foreign key constraint fails (`*`.`#sql-b64_b`, CONSTRAINT `*` FOREIGN KEY (`*`) REFERENCES `*`_丶须臾的博客-程序员秘密

我在百度搜索这个问题的时候没找到有什么提示,这里我就简单说一下。其实这个问题真的有些emmm弱智。创建外键的一个最为关键的点就是主表和从表的列要属性完全一致,而从表列有的东西主表列里一定要有!比如我主表然后从表这样就可以成功创建外键city又比如我主表从表这样创建外键district的话就会报错。为什么,因为从表district列里有“广州市”而主表没有!...