<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; Wu Xiaochang 吴晓昶 (Intel)</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/wu-xiaochang/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 14:23:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>北京IDF完成AVX课程讲解归来</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/04/15/idfavx/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/04/15/idfavx/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 10:03:27 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/04/15/idfavx/</guid>
		<description><![CDATA[从北京IDF完成AVX介绍课程的讲解，乘航班回到上海的家中已是凌晨。我在讲授的过程中做了一个调查，发现在座的许多人都写过SSE代码，都知道Intel即将在下一个平台上引入AVX指令集。国内的开发者对于最新技术的跟踪已经达到和国外同步的水平，这也得益于互联网对知识的传播和越来越开放的技术交流。每年的IDF都是春季首先在中国举行的，这使得中国能更快地接触到最新的技术，产业的潮流。相信这次IDF之后，对AVX编程感兴趣的开发者，就会率先在模拟器上来尝试开发AVX加速的应用。 遥想当年，国内最早应用SIMD技术进行优化的著名软件是梁肇星先生的超级解霸，当初号称使用Pentium MMX指令集可以软解MPEG，借助CPU内置的多媒体指令集能够实现用专用解压卡能实现的性能。那个时候互联网并没有现在这么发达，梁先生为了应用MMX需要付出多大的努力！这么多年过去，MMX早已过时，SSE系列指令集也已经发展了若干代，终于到了该升级换代的时候了！ AVX是Intel在这么多年SIMD技术应用和发展的实践中诞生的。它引入了256位向量处理能力，丰富的数据重排新指令，直观的3、4操作数指令，完整的源和目的操作数Mask体系等，将SIMD指令集的成熟度提升到一个新的水平！更高带宽、更低延时、更小代码！Intel在未来CPU里面将会增加更多面向应用的加速指令，使得软件和硬件的结合更加紧密，更方便开发者构建基于硬件能力的创新的应用。]]></description>
			<content:encoded><![CDATA[<p>从北京IDF完成AVX介绍课程的讲解，乘航班回到上海的家中已是凌晨。我在讲授的过程中做了一个调查，发现在座的许多人都写过SSE代码，都知道Intel即将在下一个平台上引入AVX指令集。国内的开发者对于最新技术的跟踪已经达到和国外同步的水平，这也得益于互联网对知识的传播和越来越开放的技术交流。每年的IDF都是春季首先在中国举行的，这使得中国能更快地接触到最新的技术，产业的潮流。相信这次IDF之后，对AVX编程感兴趣的开发者，就会率先在模拟器上来尝试开发AVX加速的应用。</p>
<p>遥想当年，国内最早应用SIMD技术进行优化的著名软件是梁肇星先生的超级解霸，当初号称使用Pentium MMX指令集可以软解MPEG，借助CPU内置的多媒体指令集能够实现用专用解压卡能实现的性能。那个时候互联网并没有现在这么发达，梁先生为了应用MMX需要付出多大的努力！这么多年过去，MMX早已过时，SSE系列指令集也已经发展了若干代，终于到了该升级换代的时候了！</p>
<p>AVX是Intel在这么多年SIMD技术应用和发展的实践中诞生的。它引入了256位向量处理能力，丰富的数据重排新指令，直观的3、4操作数指令，完整的源和目的操作数Mask体系等，将SIMD指令集的成熟度提升到一个新的水平！更高带宽、更低延时、更小代码！Intel在未来CPU里面将会增加更多面向应用的加速指令，使得软件和硬件的结合更加紧密，更方便开发者构建基于硬件能力的创新的应用。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/04/15/idfavx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSE优化中_mm_set_* 的陷阱</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/12/06/sse_mm_set/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/12/06/sse_mm_set/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 15:18:28 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[SSE优化]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/12/06/sse_mm_set/</guid>
		<description><![CDATA[我们在利用SSE指令集进行向量优化时，初始都要把常量或内存数装入到XMM寄存器中，然后再进行操作。为方便使用SSE指令，编译器将指令封装成intrinsic形式方便程序员以C语言函数的方式来调用这些指令。 但是intrinsic和指令并不是一一对应的，对于一些简单的操作，intrinsic对应于一条指令，而对一些复杂操作，intrinsic对应若干条指令，在这种情况下选择合适的intrinsic就显得十分重要。 这是我在一个优化项目过程中碰到的一个例子，我们的客户是这样使用的： p = _mm_set_epi32(*(srcData), *(srcData+1), *(srcData+2), *(srcData+3)); 这样有什么问题呢？如果打开调试器查看Assembly功能可以看到这句话翻译成7条SSE2指令： movd xmm3, DWORD PTR [12+edx] movd xmm0, DWORD PTR [8+edx] punpckldq xmm3, xmm0 movd xmm2, DWORD PTR [4+edx] movd xmm1, DWORD PTR [edx] punpckldq xmm2, xmm1 punpcklqdq xmm3, xmm2 注意到装入的srcData是连续内存地址的值，如果我们改用这条语句： p = _mm_loadu_si128((__m128i *)srcData); 就只编译成一条SSE2指令pmovdqu，当srcData是16字节对齐时，还可以用： p = _mm_load_si128((__m128i *)srcData); 同样也是编译成一条指令pmovdqa。 这样在同等情况下就大大提高了利用SSE指令的效率，提高了代码性能。那么什么时候用_mm_set_* 呢？当装入常数或内存地址不连续的时候，这时就无法利用_mm_load_*了。 有经验的程序员在使用SSE的时候都是直接用inline assembly的，因为这样一目了然，不受编译器生成代码的影响。对于一般的程序员，我们需要熟练掌握intrinsic，再加上编译器的优化，才能发挥出SSE指令的威力。]]></description>
			<content:encoded><![CDATA[<p>我们在利用SSE指令集进行向量优化时，初始都要把常量或内存数装入到XMM寄存器中，然后再进行操作。为方便使用SSE指令，编译器将指令封装成intrinsic形式方便程序员以C语言函数的方式来调用这些指令。<br />
但是intrinsic和指令并不是一一对应的，对于一些简单的操作，intrinsic对应于一条指令，而对一些复杂操作，intrinsic对应若干条指令，在这种情况下选择合适的intrinsic就显得十分重要。<br />
这是我在一个优化项目过程中碰到的一个例子，我们的客户是这样使用的：<br />
p = _mm_set_epi32(*(srcData), *(srcData+1), *(srcData+2), *(srcData+3));<br />
这样有什么问题呢？如果打开调试器查看Assembly功能可以看到这句话翻译成7条SSE2指令：<br />
movd	xmm3, DWORD PTR [12+edx]<br />
movd	xmm0, DWORD PTR [8+edx]<br />
punpckldq	xmm3, xmm0<br />
movd	xmm2, DWORD PTR [4+edx]<br />
movd 	xmm1, DWORD PTR [edx]<br />
punpckldq	xmm2, xmm1<br />
punpcklqdq 	xmm3, xmm2<br />
注意到装入的srcData是连续内存地址的值，如果我们改用这条语句：<br />
p = _mm_loadu_si128((__m128i *)srcData);<br />
就只编译成一条SSE2指令pmovdqu，当srcData是16字节对齐时，还可以用：<br />
p = _mm_load_si128((__m128i *)srcData);<br />
同样也是编译成一条指令pmovdqa。<br />
这样在同等情况下就大大提高了利用SSE指令的效率，提高了代码性能。那么什么时候用_mm_set_* 呢？当装入常数或内存地址不连续的时候，这时就无法利用_mm_load_*了。<br />
有经验的程序员在使用SSE的时候都是直接用inline assembly的，因为这样一目了然，不受编译器生成代码的影响。对于一般的程序员，我们需要熟练掌握intrinsic，再加上编译器的优化，才能发挥出SSE指令的威力。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/12/06/sse_mm_set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Parallel Inspector检测出一个项目的内存错误</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/11/20/parallel-inspector-5/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/11/20/parallel-inspector-5/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 17:19:21 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[Intel Parallel Inspector]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/11/20/parallel-inspector-5/</guid>
		<description><![CDATA[最近在做项目开发中，使用了一个开源的代码框架，Debug编译的时候一切正常，但是在Release时候就挂了。找了老半天也没找出哪里错，因为一下就跳到系统DLL，然后就崩溃了，连call stack都看不到了，应该是堆栈被破坏了。根据经验判定可能是内存分配释放问题，因为Release版本可能暴露出一些Debug版本的内存使用问题。 这时想起不是Intel Parallel Inspector能找内存错误吗？就开到它的最大内存错误检查模式试着跑一把。结果大有收获！原来是使用的框架中犯了一个经常犯的错误: p = new Foo [100] 必须用 delete [] p 结果用了delete p，但是用的是别人的框架啊，几万行代码哪儿去找这个不起眼的错误？还是工具好用，马上改过来，一切恢复正常！]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="small;"><span style="minor-latin;">最近在做项目开发中，使用了一个开源的代码框架，</span><span lang="EN-US"><span style="Calibri;">Debug</span></span><span style="minor-latin;">编译的时候一切正常，但是在</span><span lang="EN-US"><span style="Calibri;">Release</span></span><span style="minor-latin;">时候就挂了。找了老半天也没找出哪里错，因为一下就跳到系统</span><span lang="EN-US"><span style="Calibri;">DLL</span></span><span style="minor-latin;">，然后就崩溃了，连</span><span lang="EN-US"><span style="Calibri;">call stack</span></span><span style="minor-latin;">都看不到了，应该是堆栈被破坏了。根据经验判定可能是内存分配释放问题，因为</span><span lang="EN-US"><span style="Calibri;">Release</span></span><span style="minor-latin;">版本可能暴露出一些</span><span lang="EN-US"><span style="Calibri;">Debug</span></span><span style="minor-latin;">版本的内存使用问题。</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span style="small;"><span style="minor-latin;">这时想起不是</span><span lang="EN-US"><span style="Calibri;">Intel Parallel Inspector</span></span><span style="minor-latin;">能找内存错误吗？就开到它的最大内存错误检查模式试着跑一把。结果大有收获！原来是使用的框架中犯了一个经常犯的错误</span><span lang="EN-US"><span style="Calibri;">: p = new Foo [100] </span></span><span style="minor-latin;">必须用</span><span lang="EN-US"><span style="Calibri;"> delete [] p </span></span><span style="minor-latin;">结果用了</span><span lang="EN-US"><span style="Calibri;">delete p</span></span><span style="minor-latin;">，但是用的是别人的框架啊，几万行代码哪儿去找这个不起眼的错误？还是工具好用，马上改过来，一切恢复正常！</span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/11/20/parallel-inspector-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>代码优化的第一步是判定程序热点</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/11/07/400002658/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/11/07/400002658/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 04:13:40 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[Hotspots]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/11/07/400002658/</guid>
		<description><![CDATA[我们在做性能优化的时候，第一步需要判定哪部分程序最需要做优化，一般来说程序运行最耗时的那部分，也就是程序热点（Hotspots）是我们的候选，而优化热点函数后性能提升效果也最明显。 为什么要提这个问题呢？因为最近做过一些项目，很多人一上来看到程序中这里适合用多线程，那里适合用SSE，但是有没有先考虑过这部分程序优化后性能提升的比例能有多少？一般我们在做优化之前都需要有一个基本的估计，需要优化的代码占程序总运行时间的多少，用不同的手段最多能达到怎么样的优化效果，达到这样的效果后是否满足我的既定目标？这样分析下来后才开始分配人力和时间资源。 有些人觉得，我自己心里很清楚程序哪里最耗时。但是感觉往往不是那么精确的，现在寻找热点的工具有很多， VTune，Parallel Amplifier等都可以做到。既然有工具，我们就借助工具定量地进行分析，做为我们开始的第一步。  ]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="2.0;"><span style="small;"><span style="minor-latin;">我们在做性能优化的时候，第一步需要判定哪部分程序最需要做优化，一般来说程序运行最耗时的那部分，也就是程序热点（</span><span lang="EN-US"><span style="Calibri;">Hotspots</span></span><span style="minor-latin;">）是我们的候选，而优化热点函数后性能提升效果也最明显。</span></span></p>
<p class="MsoNormal" style="2.0;"><span style="small;"><span style="minor-latin;">为什么要提这个问题呢？因为最近做过一些项目，很多人一上来看到程序中这里适合用多线程，那里适合用</span><span lang="EN-US"><span style="Calibri;">SSE</span></span><span style="minor-latin;">，但是有没有先考虑过这部分程序优化后性能提升的比例能有多少？一般我们在做优化之前都需要有一个基本的估计，需要优化的代码占程序总运行时间的多少，用不同的手段最多能达到怎么样的优化效果，达到这样的效果后是否满足我的既定目标？这样分析下来后才开始分配人力和时间资源。</span></span></p>
<p class="MsoNormal" style="2.0;"><span style="small;"><span style="minor-latin;">有些人觉得，我自己心里很清楚程序哪里最耗时。但是感觉往往不是那么精确的，现在寻找热点的工具有很多，</span><span style="Calibri;"> <span lang="EN-US">VTune</span></span><span style="minor-latin;">，</span><span lang="EN-US"><span style="Calibri;">Parallel Amplifier</span></span><span style="minor-latin;">等都可以做到。既然有工具，我们就借助工具定量地进行分析，做为我们开始的第一步。</span></span></p>
<p class="MsoNormal" style="0cm 0cm 0pt;"><span lang="EN-US"><span style="Calibri;"> </span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/11/07/400002658/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Intel Compiler 11.1和SDE模拟器进行AVX开发</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/07/06/intel-compiler-111sdeavx/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/07/06/intel-compiler-111sdeavx/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 07:17:29 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[AVX]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/07/06/intel-compiler-111sdeavx/</guid>
		<description><![CDATA[Intel® Advanced Vector Extensions (Intel® AVX) 在浮点运算上扩展了Intel® SSE的能力。Intel® AVX使用256位寄存器（SSE为128位）并对指令集进行了扩展。每条指令可以同时处理8个float或4个double数据。   对于浮点处理密集型的应用，非常适合于进行AVX优化。Intel支持AVX的Sandy Bridge平台还未发布，在发布之前我们如何进行AVX开发呢？答案是通过Intel® Compiler（ICL）和Intel® Software Development Emulator（SDE），编译并模拟运行包含新指令集的程序。   下面简要介绍模拟环境的搭建。   首先下载并安装ICL 11.1, 最新的11.1版本支持生成AVX指令的程序，在Intel主页上可免费获得30天试用的license。安装好后我们在VS2005集成环境里面就可以使用ICL了。   下载SDE的压缩包并解压到任意目录，然后设置PATH环境变量使之包含这个目录。   我们使用Benefits of Intel AVX For Small Matrices这篇文章附带的源码进行试验。在VS2005中新建C++项目并把源代码文件添加到其中，把代码里面的 #include &#60;gmmintrin.h&#62; 改为 #include &#60;immintrin.h&#62;，该文件头为ICL中支持AVX intrinsic的文件头，然后在ICL上编译通过。这时如果直接运行程序会显示非法指令错误，程序需要在模拟器中运行。   打开一个Command Line窗口并进入可执行文件所在目录，运行：   &#62; sde -- Add4x4Matrices.exe   程序即可正确运行并输出结果。   在开发过程中可以使用Intel Intrinsic Guide，通过它可快速查询SIMD指令（包含SSEx，AVX等）的用法，可以从Intel AVX主页上下载。   资源： [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="Times New Roman;">Intel® Advanced Vector Extensions (Intel® AVX) </span><span style="'Times New Roman';" lang="ZH-CN">在浮点运算上扩展了</span><span style="Times New Roman;">Intel® SSE</span><span style="'Times New Roman';" lang="ZH-CN">的能力。</span><span style="Times New Roman;">Intel® AVX</span><span style="'Times New Roman';" lang="ZH-CN">使用</span><span style="Times New Roman;">256</span><span style="'Times New Roman';" lang="ZH-CN">位寄存器（</span><span style="Times New Roman;">SSE</span><span style="'Times New Roman';" lang="ZH-CN">为</span><span style="Times New Roman;">128</span><span style="'Times New Roman';" lang="ZH-CN">位）并对指令集进行了扩展。每条指令可以同时处理</span><span style="Times New Roman;">8</span><span style="'Times New Roman';" lang="ZH-CN">个</span><span style="Times New Roman;">float</span><span style="'Times New Roman';" lang="ZH-CN">或</span><span style="Times New Roman;">4</span><span style="'Times New Roman';" lang="ZH-CN">个</span><span style="Times New Roman;">double</span><span style="'Times New Roman';" lang="ZH-CN">数据。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">对于浮点处理密集型的应用，非常适合于进行</span><span style="Times New Roman;">AVX</span><span style="'Times New Roman';" lang="ZH-CN">优化。</span><span style="Times New Roman;">Intel</span><span style="'Times New Roman';" lang="ZH-CN">支持</span><span style="Times New Roman;">AVX</span><span style="'Times New Roman';" lang="ZH-CN">的</span><span style="Times New Roman;">Sandy Bridge</span><span style="'Times New Roman';" lang="ZH-CN">平台还未发布，在发布之前我们如何进行</span><span style="Times New Roman;">AVX</span><span style="'Times New Roman';" lang="ZH-CN">开发呢？答案是通过</span><span style="Times New Roman;">Intel® Compiler</span><span style="'Times New Roman';" lang="ZH-CN">（</span><span style="Times New Roman;">ICL</span><span style="'Times New Roman';" lang="ZH-CN">）和</span><span style="Times New Roman;">Intel® Software Development Emulator</span><span style="'Times New Roman';" lang="ZH-CN">（</span><span style="Times New Roman;">SDE</span><span style="'Times New Roman';" lang="ZH-CN">），编译并模拟运行包含新指令集的程序。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="'Times New Roman';" lang="ZH-CN"><span style="small;">下面简要介绍模拟环境的搭建。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">首先下载并安装</span><span style="Times New Roman;">ICL 11.1, </span><span style="'Times New Roman';" lang="ZH-CN">最新的</span><span style="Times New Roman;">11.1</span><span style="'Times New Roman';" lang="ZH-CN">版本支持生成</span><span style="Times New Roman;">AVX</span><span style="'Times New Roman';" lang="ZH-CN">指令的程序，在</span><span style="Times New Roman;">Intel</span><span style="'Times New Roman';" lang="ZH-CN">主页上可免费获得</span><span style="Times New Roman;">30</span><span style="'Times New Roman';" lang="ZH-CN">天试用的</span><span style="Times New Roman;">license</span><span style="'Times New Roman';" lang="ZH-CN">。安装好后我们在</span><span style="Times New Roman;">VS2005</span><span style="'Times New Roman';" lang="ZH-CN">集成环境里面就可以使用</span><span style="Times New Roman;">ICL</span><span style="'Times New Roman';" lang="ZH-CN">了。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">下载</span><span style="Times New Roman;">SDE</span><span style="'Times New Roman';" lang="ZH-CN">的压缩包并解压到任意目录，然后设置</span><span style="Times New Roman;">PATH</span><span style="'Times New Roman';" lang="ZH-CN">环境变量使之包含这个目录。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">我们使用</span><span style="Times New Roman;">Benefits of Intel AVX For Small Matrices</span><span style="'Times New Roman';" lang="ZH-CN">这篇文章附带的源码进行试验。在</span><span style="Times New Roman;">VS2005</span><span style="'Times New Roman';" lang="ZH-CN">中新建</span><span style="Times New Roman;">C++</span><span style="'Times New Roman';" lang="ZH-CN">项目并把源代码文件添加到其中，把代码里面的</span><span lang="ZH-CN"><span style="Times New Roman;"> </span></span></span><span style="yes;">#include</span><span style="yes;"> <span style="#a31515;">&lt;gmmintrin.h&gt; </span></span><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">改为</span><span lang="ZH-CN"><span style="Times New Roman;"> </span></span></span><span style="yes;">#include</span><span style="yes;"> <span style="#a31515;">&lt;immintrin.h&gt;</span></span><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">，该文件头为</span><span style="Times New Roman;">ICL</span><span style="'Times New Roman';" lang="ZH-CN">中支持</span><span style="Times New Roman;">AVX intrinsic</span><span style="'Times New Roman';" lang="ZH-CN">的文件头，然后在</span><span style="Times New Roman;">ICL</span><span style="'Times New Roman';" lang="ZH-CN">上编译通过。这时如果直接运行程序会显示非法指令错误，程序需要在模拟器中运行。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">打开一个</span><span style="Times New Roman;">Command Line</span><span style="'Times New Roman';" lang="ZH-CN">窗口并进入可执行文件所在目录，运行：</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="yes;">&gt; sde -- Add4x4Matrices.exe</span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="'Times New Roman';" lang="ZH-CN"><span style="small;">程序即可正确运行并输出结果。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="'Times New Roman';" lang="ZH-CN">在开发过程中可以使用</span><span style="Times New Roman;">Intel Intrinsic Guide</span><span style="'Times New Roman';" lang="ZH-CN">，通过它可快速查询</span><span style="Times New Roman;">SIMD</span><span style="'Times New Roman';" lang="ZH-CN">指令（包含</span><span style="Times New Roman;">SSEx</span><span style="'Times New Roman';" lang="ZH-CN">，</span><span style="Times New Roman;">AVX</span><span style="'Times New Roman';" lang="ZH-CN">等）的用法，可以从</span><span style="Times New Roman;">Intel AVX</span><span style="'Times New Roman';" lang="ZH-CN">主页上下载。</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"> </p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="'Times New Roman';" lang="ZH-CN"><span style="small;">资源：</span></span></p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="small;"><span style="Times New Roman;">Intel AVX </span><span style="'Times New Roman';" lang="ZH-CN">主页</span><span style="Times New Roman;">, </span></span><a href="http://software.intel.com/en-us/avx/"><span style="Times New Roman;">http://software.intel.com/en-us/avx/</span></a></p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="Times New Roman;">Intel Compiler 11.1, </span><a href="http://software.intel.com/en-us/intel-compilers/"><span style="Times New Roman;">http://software.intel.com/en-us/intel-compilers/</span></a></p>
<p class="MsoNormal" style="0in 0in 0pt;"><span style="Times New Roman;">Intel SDE, </span><a href="http://software.intel.com/en-us/articles/intel-software-development-emulator/"><span style="Times New Roman;">http://software.intel.com/en-us/articles/intel-software-development-emulator/</span></a></p>
<p><span style="AR-SA;">Benefits of Intel AVX For Small Matrices, <a href="http://software.intel.com/en-us/articles/benefits-of-intel-avx-for-small-matrices/">http://software.intel.com/en-us/articles/benefits-of-intel-avx-for-small-matrices/</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/07/06/intel-compiler-111sdeavx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Direct3D的浮点精度问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/06/08/direct3d/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/06/08/direct3d/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 03:49:36 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[D3D]]></category>
		<category><![CDATA[D3DCREATE_FPU_PRESERVE]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/06/08/direct3d/</guid>
		<description><![CDATA[Direct3D的浮点精度问题 最近编写一个Firefox的小插件，里面利用D3D进行Render，结果导致Firefox的UI渲染错误（插件后面的主窗口背景变成黑色），检查了好几天发现程序逻辑并没有问题，窗口函数和消息处理都正常。后来偶然发现同样用OpenGL渲染没有问题，再三查找发现问题出在D3D的浮点精度上面。从D3D的文档D3DCREATE条目中查到的： D3DCREATE_FPU_PRESERVE Set the precision for Direct3D floating-point calculations to the precision used by the calling thread. If you do not specify this flag, Direct3D defaults to single-precision round-to-nearest mode for two reasons: - Double-precision mode will reduce Direct3D performance. - Portions of Direct3D assume floating-point unit exceptions are masked; unmasking these exceptions may [...]]]></description>
			<content:encoded><![CDATA[<p>Direct3D的浮点精度问题</p>
<p>最近编写一个Firefox的小插件，里面利用D3D进行Render，结果导致Firefox的UI渲染错误（插件后面的主窗口背景变成黑色），检查了好几天发现程序逻辑并没有问题，窗口函数和消息处理都正常。后来偶然发现同样用OpenGL渲染没有问题，再三查找发现问题出在D3D的浮点精度上面。从D3D的文档D3DCREATE条目中查到的：</p>
<p><strong>D3DCREATE_FPU_PRESERVE</strong> Set the precision for Direct3D floating-point calculations to the precision used by the calling thread. If you do not specify this flag, Direct3D defaults to single-precision round-to-nearest mode for two reasons: </p>
<p>- Double-precision mode will reduce Direct3D performance. </p>
<p>- Portions of Direct3D assume floating-point unit exceptions are masked; unmasking these exceptions may result in undefined behavior </p>
<p>在调用IDirect3D9::CreateDevice的时候，D3D默认改变了程序的浮点精度（出于性能的考虑），导致Firefox的UI出错，加上了这个选项就正常了，而实际上性能并没有比原来低多少。</p>
<p>在开发实践中，很多不起眼的细节都能影响程序的结果！而很多不相关的事情其实都是有千丝万缕的联系，编码的时候总有在设计时想不到的事情发生，这就是理论和实践的区别所在！印证了一句名言：<br />
In theory, there is no difference between theory and practice. In practice, there is。</p>
<p>我们平时对整数比较熟悉，但是对浮点数比较陌生，这里有篇文章比较深入地探讨了FPU：Know Your FPU <a href="http://www.stereopsis.com/FPU.html">http://www.stereopsis.com/FPU.html</a>，和它的更新版.<a href="http://www.stereopsis.com/sree/fpu2006.html">http://www.stereopsis.com/sree/fpu2006.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/06/08/direct3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多核时代的游戏体验</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/08/04/190/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/08/04/190/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 08:33:18 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/08/04/190/</guid>
		<description><![CDATA[ISN上的博客文章 looks aren't everything -- making games act real （http://software.intel.com/en-us/blogs/2008/06/06/looks-arent-everything-making-games-act-real/） 谈到多核时代的游戏不仅仅是看起来真实（look real），而且要动起来真实（act real）。 文章提到了几点可以改进游戏体验的方向： 1. 通过游戏或引擎的多线程化增加帧速率 2. 加速assert的装入，使得场景的切换更加平滑 3. 利用procedural content generation动态创建丰富的大规模场景，减轻artist的负担 4. 增加更丰富和真实的粒子效果：烟，火，天气系统等 5. 增强游戏内角色的AI 6. 增强游戏物理使得物体之间更自然的互动 过去的这些年，我们在建模和渲染上努力使得游戏场景视觉上的真实性大大增强，各种Shader和强大的GPU运算能力使得3D游戏的画面质量上了一个新的水平。然而，目前很多游戏中只是简单的使用的碰撞检测，没有充分体现出物体的物理特性，场景中物体运动只能按照预设的轨迹或行为进行，无法跟周围的环境进行互动，不具备智能性。在多核时代我们除了进行原来的渲染，游戏逻辑处理外，还可以利用额外的处理器核心增加粒子系统，physics和AI计算，给游戏玩家带来更好的体验。 现在开发人员可以下载Intel提供的免费非商业版Havok Physics和Animation引擎 （http://tryhavok.intel.com/） 进行学习和研究 ISN上面还专门开辟了一个技术论坛对Havok用户进行技术支持：http://softwarecommunity.intel.com/isn/Community/en-US/forums/2508/ShowForum.aspx 让我们一起努力，在游戏中增加更多让我们可以act real的元素！]]></description>
			<content:encoded><![CDATA[<p>ISN上的博客文章 looks aren't everything -- making games act real<br />
（<a href="http://software.intel.com/en-us/blogs/2008/06/06/looks-arent-everything-making-games-act-real/"><span style="#0860a8;">http://software.intel.com/en-us/blogs/2008/06/06/looks-arent-everything-making-games-act-real/</span></a>）<br />
谈到多核时代的游戏不仅仅是看起来真实（look real），而且要动起来真实（act real）。</p>
<p>文章提到了几点可以改进游戏体验的方向：</p>
<p>1. 通过游戏或引擎的多线程化增加帧速率<br />
2. 加速assert的装入，使得场景的切换更加平滑<br />
3. 利用procedural content generation动态创建丰富的大规模场景，减轻artist的负担<br />
4. 增加更丰富和真实的粒子效果：烟，火，天气系统等<br />
5. 增强游戏内角色的AI<br />
6. 增强游戏物理使得物体之间更自然的互动</p>
<p>过去的这些年，我们在建模和渲染上努力使得游戏场景视觉上的真实性大大增强，各种Shader和强大的GPU运算能力使得3D游戏的画面质量上了一个新的水平。然而，目前很多游戏中只是简单的使用的碰撞检测，没有充分体现出物体的物理特性，场景中物体运动只能按照预设的轨迹或行为进行，无法跟周围的环境进行互动，不具备智能性。在多核时代我们除了进行原来的渲染，游戏逻辑处理外，还可以利用额外的处理器核心增加粒子系统，physics和AI计算，给游戏玩家带来更好的体验。</p>
<p>现在开发人员可以下载Intel提供的免费非商业版Havok Physics和Animation引擎 （<a href="http://tryhavok.intel.com/"><span style="#0860a8;">http://tryhavok.intel.com/</span></a>） 进行学习和研究<br />
ISN上面还专门开辟了一个技术论坛对Havok用户进行技术支持：<a href="http://softwarecommunity.intel.com/isn/Community/en-US/forums/2508/ShowForum.aspx"><span style="#0860a8;">http://softwarecommunity.intel.com/isn/Community/en-US/forums/2508/ShowForum.aspx</span></a><br />
让我们一起努力，在游戏中增加更多让我们可以act real的元素！</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/08/04/190/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Intel 45nm制程处理器上的SSE4指令集简介</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/03/25/intel-45nmsse4/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/03/25/intel-45nmsse4/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 03:24:26 +0000</pubDate>
		<dc:creator>Wu Xiaochang 吴晓昶 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/03/25/intel-45nmsse4/</guid>
		<description><![CDATA[Intel 45nm制程处理器上的SSE4指令集简介  Intel的SSE（Streaming SIMD Extensions, 流式单指令多数据扩展）技术有效增强了CPU的向量运算能力。支持该指令集的处理器有8个128位xmm寄存器，每一个寄存器可以同时存放4个32位整数(int), 4个32单精度浮点数(float) 或2个64位双精度浮点数(double)。比如我们在3D开发中常见的4元组32位浮点数结构&#60;x, y, z, w&#62;, &#60;r, g, b, a&#62;都可以封装在一个xmm寄存器中。 SIMD（single-instruction, multiple-data）使用单条指令同时完成处理多个数据的操作。假定 我们要计算一个32位浮点数数组中每一个元素的平方根，可以将数组中的每4个元素加载到一个128位xmm寄存器中，然后使用一条SSE指令同时计算这4个数的平方根，然后把所得的4个结果写回内存。 Intel 的SIMD技术从Pentium MMX时代引入，后来发展成SSE/SSE2/SSE3/SSSE3等。在Intel 45nm制程处理器引入了54条新的指令，在Core微架构的下一代Penryn微架构中引入了47条，称为SSE4.1，在Penryn的下一代Nehalem中再引入了另外7条，称为SSE4.2. 新的指令集主要是为了增强多媒体，图象和3D应用程序的性能，这些应用都需要充分发挥CPU提供的能力来进行运算。强烈建议进行这些应用开发的朋友关注一下SSE指令集，不需要很大的工作量就可以给你们的程序带来很大的性能提升。 开发SSE最好的方法是使用编译器＋intrinsics，可以使用类C的函数调用来利用SSE，同时能充分利用到编译器的编译优化。不需要手动编写复杂的汇编代码。最新的Intel Compiler 10可以支持生成SSE4指令。另外最新消息显示VS2008中已经加上了SSE4支持。SSE4的详细内容可以参见这里 使用SSE最常见的就是进行矩阵和向量，这里有一篇很好的whitepaper显示如何使用SSE指令集进行4x4矩阵和4元组向量运算的优化，可以以此为基础打造自己的函数库，并加上最新的SSE4指令集支持。 Optimized Matrix Library for use with the Intel® Pentium® 4 Processor's SSE2 Instructions http://softwarecommunity.intel.com/articles/eng/2494.htm 附带的源代码中包含单精度(SP)和双精度(DP)浮点数的向量和矩阵运算类，需要用Intel Compiler进行编译。 http://softwarecommunity.intel.com/articles/eng/1957.htm?target=http%3A%2F%2Fsoftwarecommunity.intel.com%2Fisn%2Fdownloads%2FMatrixLibrary.zip]]></description>
			<content:encoded><![CDATA[<p><strong><font face="Times New Roman">Intel 45nm</font></strong><strong>制程处理器上的</strong><strong><font face="Times New Roman">SSE4</font></strong><strong>指令集简介</strong><font face="Times New Roman"> </font></p>
<p><font face="Times New Roman">Intel</font>的<font face="Times New Roman">SSE</font>（<font face="Times New Roman">Streaming SIMD Extensions, </font>流式单指令多数据扩展）技术有效增强了<font face="Times New Roman">CPU</font>的向量运算能力。支持该指令集的处理器有<font face="Times New Roman">8</font>个<font face="Times New Roman">128</font>位<font face="Times New Roman">xmm</font>寄存器，每一个寄存器可以同时存放<font face="Times New Roman">4</font>个<font face="Times New Roman">32</font>位整数<font face="Times New Roman">(int), 4</font>个<font face="Times New Roman">32</font>单精度浮点数<font face="Times New Roman">(float) </font>或<font face="Times New Roman">2</font>个<font face="Times New Roman">64</font>位双精度浮点数<font face="Times New Roman">(double)</font>。比如我们在<font face="Times New Roman">3D</font>开发中常见的<font face="Times New Roman">4</font>元组<font face="Times New Roman">32</font>位浮点数结构<font face="Times New Roman">&lt;x, y, z, w&gt;, &lt;r, g, b, a&gt;</font>都可以封装在一个<font face="Times New Roman">xmm</font>寄存器中。</p>
<p><font face="Times New Roman">SIMD</font>（<font face="Times New Roman">single-instruction, multiple-data</font>）使用单条指令同时完成处理多个数据的操作。假定</p>
<p>我们要计算一个<font face="Times New Roman">32</font>位浮点数数组中每一个元素的平方根，可以将数组中的每<font face="Times New Roman">4</font>个元素加载到一个<font face="Times New Roman">128</font>位<font face="Times New Roman">xmm</font>寄存器中，然后使用一条<font face="Times New Roman">SSE</font>指令同时计算这<font face="Times New Roman">4</font>个数的平方根，然后把所得的<font face="Times New Roman">4</font>个结果写回内存。</p>
<p><font face="Times New Roman">Intel </font>的<font face="Times New Roman">SIMD</font>技术从<font face="Times New Roman">Pentium MMX</font>时代引入，后来发展成<font face="Times New Roman">SSE/SSE2/SSE3/SSSE3</font>等。在<font face="Times New Roman">Intel 45nm</font>制程处理器引入了<font face="Times New Roman">54</font>条新的指令，在<font face="Times New Roman">Core</font>微架构的下一代<font face="Times New Roman">Penryn</font>微架构中引入了<font face="Times New Roman">47</font>条，称为<font face="Times New Roman">SSE4.1</font>，在<font face="Times New Roman">Penryn</font>的下一代<font face="Times New Roman">Nehalem</font>中再引入了另外<font face="Times New Roman">7</font>条，称为<font face="Times New Roman">SSE4.2. </font>新的指令集主要是为了增强多媒体，图象和<font face="Times New Roman">3D</font>应用程序的性能，这些应用都需要充分发挥<font face="Times New Roman">CPU</font>提供的能力来进行运算。强烈建议进行这些应用开发的朋友关注一下<font face="Times New Roman">SSE</font>指令集，不需要很大的工作量就可以给你们的程序带来很大的性能提升。</p>
<p>开发<font face="Times New Roman">SSE</font>最好的方法是使用编译器＋<font face="Times New Roman">intrinsics</font>，可以使用类<font face="Times New Roman">C</font>的函数调用来利用<font face="Times New Roman">SSE</font>，同时能充分利用到编译器的编译优化。不需要手动编写复杂的汇编代码。最新的<a href="http://www3.intel.com/cd/software/products/asmo-na/eng/compilers/284527.htm"><font face="Times New Roman">Intel Compiler 10</font></a>可以支持生成<font face="Times New Roman">SSE4</font>指令。另外<a href="http://blogs.msdn.com/vcblog/archive/2007/10/18/new-intrinsic-support-in-visual-studio-2008.aspx">最新消息</a>显示<font face="Times New Roman">VS2008</font>中已经加上了<font face="Times New Roman">SSE4</font>支持。<font face="Times New Roman">SSE4</font>的详细内容可以参见<a href="http://softwarecommunity.intel.com/articles/eng/1193.htm">这里</a></p>
<p>使用<font face="Times New Roman">SSE</font>最常见的就是进行矩阵和向量，这里有一篇很好的<font face="Times New Roman">whitepaper</font>显示如何使用<font face="Times New Roman">SSE</font>指令集进行<font face="Times New Roman">4x4</font>矩阵和<font face="Times New Roman">4</font>元组向量运算的优化，可以以此为基础打造自己的函数库，并加上最新的<font face="Times New Roman">SSE4</font>指令集支持。</p>
<p><font face="Times New Roman">Optimized Matrix Library for use with the Intel® Pentium® 4 Processor's SSE2 Instructions</font></p>
<p><a href="http://softwarecommunity.intel.com/articles/eng/2494.htm" title="http://softwarecommunity.intel.com/articles/eng/2494.htm"><font face="Times New Roman">http://softwarecommunity.intel.com/articles/eng/2494.htm</font></a></p>
<p>附带的源代码中包含单精度<font face="Times New Roman">(SP)</font>和双精度<font face="Times New Roman">(DP)</font>浮点数的向量和矩阵运算类，需要用<font face="Times New Roman">Intel Compiler</font>进行编译。</p>
<p><a href="http://softwarecommunity.intel.com/articles/eng/1957.htm?target=http%3A%2F%2Fsoftwarecommunity.intel.com%2Fisn%2Fdownloads%2FMatrixLibrary.zip" title="http://softwarecommunity.intel.com/articles/eng/1957.htm?target=http%3A%2F%2Fsoftwarecommunity.intel.com%2Fisn%2Fdownloads%2FMatrixLibrary.zip"><font face="Times New Roman">http://softwarecommunity.intel.com/articles/eng/1957.htm?target=http%3A%2F%2Fsoftwarecommunity.intel.com%2Fisn%2Fdownloads%2FMatrixLibrary.zip</font></a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/03/25/intel-45nmsse4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

