﻿<?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>英特尔® 软件网络博客 - 中文</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Tue, 09 Feb 2010 06:12:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>漫谈从RISC向IA移植(2)</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/09/riscia2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/09/riscia2/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 06:12:30 +0000</pubDate>
		<dc:creator>Bruce Chen 陈宇达 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/09/riscia2/</guid>
		<description><![CDATA[下面就说说我个人总结的移植方法论，欢迎板砖。
移植考虑的内容很多，绝不仅仅是软件，要对整个系统通盘考量。我们一一展开讨论，这里面最关键的就是通篇考虑企业基础架构，制定移植计划。
移植首先要分析的就是企业的基础架构，只有基础架构可以顺利移植，才能实现对整个解决方案的移植，否则就会减缓移植的进程，甚至导致移植的失败：
	&#62; 移植必须建立在符合要求的企业基础架构之上
	&#62; 对基础架构的考量要有系统的变动管理流程，使用流程而不仅仅是经验来进行管理
	&#62; 基础架构变动的流程管理一般需要考虑以下方面，所有以下方面均应考虑好移植的可行性，是否有替代方案，分析出移植的可能瓶颈：
	   &#62;&#62; 网络
	   &#62;&#62; 操作系统
	   &#62;&#62; 身份管理（ID）
	   &#62;&#62; 软件栈全生命周期
	   &#62;&#62; 系统配置
	   &#62;&#62; 数据
	   &#62;&#62; 服务器、存储、交换机等硬件系统
下面就是从RISC向IA移植的基本考虑方面示意图：

]]></description>
			<content:encoded><![CDATA[<p>下面就说说我个人总结的移植方法论，欢迎板砖。</p>
<p>移植考虑的内容很多，绝不仅仅是软件，要对整个系统通盘考量。我们一一展开讨论，这里面最关键的就是通篇考虑企业基础架构，制定移植计划。</p>
<p>移植首先要分析的就是企业的基础架构，只有基础架构可以顺利移植，才能实现对整个解决方案的移植，否则就会减缓移植的进程，甚至导致移植的失败：<br />
	&gt; 移植必须建立在符合要求的企业基础架构之上<br />
	&gt; 对基础架构的考量要有系统的变动管理流程，使用流程而不仅仅是经验来进行管理<br />
	&gt; 基础架构变动的流程管理一般需要考虑以下方面，所有以下方面均应考虑好移植的可行性，是否有替代方案，分析出移植的可能瓶颈：<br />
	   &gt;&gt; 网络<br />
	   &gt;&gt; 操作系统<br />
	   &gt;&gt; 身份管理（ID）<br />
	   &gt;&gt; 软件栈全生命周期<br />
	   &gt;&gt; 系统配置<br />
	   &gt;&gt; 数据<br />
	   &gt;&gt; 服务器、存储、交换机等硬件系统</p>
<p>下面就是从RISC向IA移植的基本考虑方面示意图：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/untitled1.jpg"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/untitled1-300x156.jpg" alt="" width="300" height="156" class="alignnone size-medium wp-image-400003343" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/09/riscia2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>摩尔定理再次验证,INTEL 32NM I5来了</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/05/intel-32nm-i5/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/05/intel-32nm-i5/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 05:51:57 +0000</pubDate>
		<dc:creator>avensue</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[移动技术]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/05/intel-32nm-i5/</guid>
		<description><![CDATA[摩尔定理再次得到验证，更高，更快，更强似乎永远是INTEL的座右铭
45NM的风潮才过去，32NM又来了。不过哪怕到3.2NM，我估计也不会惊讶，因为人类的精神在于进取
附1张表

]]></description>
			<content:encoded><![CDATA[<p>摩尔定理再次得到验证，更高，更快，更强似乎永远是INTEL的座右铭</p>
<p>45NM的风潮才过去，32NM又来了。不过哪怕到3.2NM，我估计也不会惊讶，因为人类的精神在于进取</p>
<p>附1张表<br />
<img src="http://images.anandtech.com/reviews/cpu/intel/Clarkdale/mobilecpus.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/05/intel-32nm-i5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何在一台机器上使用多个版本IPP</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/04/ipp/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/04/ipp/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 08:38:37 +0000</pubDate>
		<dc:creator>丛杨 (Intel)</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/04/ipp/</guid>
		<description><![CDATA[最近在用IPP实现AES的加密模块，为了对比几个版本IPP在加密模块上的性能，
要在同一台机器上装几个版本的IPP。
并在运行同一个执行文件的时候链接不同版本的IPP库。
为了实现这种做法，我们需要在编译的时候链接IPP的动态库。
在运行执行文件的时候，修改链接库的目录。
下面举一个例子，系统是linux，Windows应该同理。
假设源代码文件a.cpp,编译生成的执行文件为a_exec,另外IPP有两个版本：ipp版本A，ipp版本B。
1）如果版本A和版本B的大版本号一致，例如都是6.1.***，那么可以不用重新编译
编译的命令为：
g++ -o a_exec a.cpp -I /ipp版本A or B的安装目录/include， ipp_aes.cpp -L /ipp版本A or B的安装目录/sharedlib -
lpthread -lippcpem64t -lguide
生成的执行文件 a_exec 在执行的时候可以选择链接版本A的库或是版本B的库。
执行命令为：
# export export LD_LIBRARY_PATH=/ipp版本A/sharedlib
# ./a_exec
结果为使用IPP版本A的结果
# export export LD_LIBRARY_PATH=/ipp版本B/sharedlib
# ./a_exec
结果为使用IPP版本B的结果
2）如果版本A和版本B的大版本号不一样，比如A为6.1.***，B为5.*.**,文件需要分别编译：
使用版本A：
# g++ -o a_exec a.cpp -I /ipp版本A的安装目录/include， ipp_aes.cpp -L /ipp版本A的安装目录/sharedlib -lpthread  -lippcpem64t -lguide
# export export LD_LIBRARY_PATH=/ipp版本A/sharedlib
# ./a_exec
使用版本B：
# g++ -o a_exec a.cpp -I /ipp版本B的安装目录/include， ipp_aes.cpp -L /ipp版本B的安装目录/sharedlib -lpthread  -lippcpem64t -lguide
# export [...]]]></description>
			<content:encoded><![CDATA[<p>最近在用IPP实现AES的加密模块，为了对比几个版本IPP在加密模块上的性能，<br />
要在同一台机器上装几个版本的IPP。<br />
并在运行同一个执行文件的时候链接不同版本的IPP库。</p>
<p>为了实现这种做法，我们需要在编译的时候链接IPP的动态库。<br />
在运行执行文件的时候，修改链接库的目录。</p>
<p>下面举一个例子，系统是linux，Windows应该同理。</p>
<p>假设源代码文件a.cpp,编译生成的执行文件为a_exec,另外IPP有两个版本：ipp版本A，ipp版本B。</p>
<p>1）如果版本A和版本B的大版本号一致，例如都是6.1.***，那么可以不用重新编译</p>
<p>编译的命令为：</p>
<p>g++ -o a_exec a.cpp -I /ipp版本A or B的安装目录/include， ipp_aes.cpp -L /ipp版本A or B的安装目录/sharedlib -</p>
<p>lpthread -lippcpem64t -lguide</p>
<p>生成的执行文件 a_exec 在执行的时候可以选择链接版本A的库或是版本B的库。</p>
<p>执行命令为：<br />
# export export LD_LIBRARY_PATH=/ipp版本A/sharedlib<br />
# ./a_exec<br />
结果为使用IPP版本A的结果</p>
<p># export export LD_LIBRARY_PATH=/ipp版本B/sharedlib<br />
# ./a_exec<br />
结果为使用IPP版本B的结果</p>
<p>2）如果版本A和版本B的大版本号不一样，比如A为6.1.***，B为5.*.**,文件需要分别编译：</p>
<p>使用版本A：<br />
# g++ -o a_exec a.cpp -I /ipp版本A的安装目录/include， ipp_aes.cpp -L /ipp版本A的安装目录/sharedlib -lpthread  -lippcpem64t -lguide</p>
<p># export export LD_LIBRARY_PATH=/ipp版本A/sharedlib<br />
# ./a_exec</p>
<p>使用版本B：<br />
# g++ -o a_exec a.cpp -I /ipp版本B的安装目录/include， ipp_aes.cpp -L /ipp版本B的安装目录/sharedlib -lpthread  -lippcpem64t -lguide</p>
<p># export export LD_LIBRARY_PATH=/ipp版本B/sharedlib<br />
# ./a_exec</p>
<p>这样就可以分别得到使用不同IPP库的性能数据了。</p>
<p>如果要在另外一台机器上运行这个执行文件，<br />
只需把执行文件，以及相应IPP版本的动态库拷贝到这台机器上，并在执行前运行：<br />
# export export LD_LIBRARY_PATH=ipp库所在的目录<br />
就可以看到这个执行文件在这台机器上的性能数据了。</p>
<p>OK，就是这样。<br />
P.S. 最新版的IPP性能还真是不错。<br />
P.P.S.希望我也能跟duofeng同学一样把工作里遇到的方法记录下来，哪怕只是很小很小的一点。<br />
P.P.P.S.这次测试的数据以及编写的代码应该会在不久后就可以发布。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/04/ipp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>提高Media SDK效率之异步优化篇</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/04/media-sdk-7/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/04/media-sdk-7/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 05:05:54 +0000</pubDate>
		<dc:creator>Yanqing Wang (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/04/media-sdk-7/</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;提高Media SDK效率之多线程篇中已经讲述了如何使用多线程提高编解码的效能问题。因为增加了队列（Queue）的创建和维护等附加工作，在多线程情况下程序的复杂性也被加大，那么还有没有其他方面可以采用呢？本文以此为讨论出发点，主要从异步角度出发，讨论如何采用合适的异步方法来提高编解码器的效能问题。
在多线程方案中，我们使用队列（Queue）的同步机制来保证三个模块的协同工作，如图1所示。

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;图1 模块线程化输入输出图
从图1中，网友不难发现有两个基本的开销点：
-	需要3次同步帧（SyncFrame）来完成一次编解码动作。
-	模块间的2个共享Queue都需要做同步操作。
这两个开销点对于多线程效率和竞争是不利的，那么有什么方法可以剔除或减小这种开销呢？
幸运的是Media SDK提供了异步机制，它提供了三个函数支持相应的三个模块：
-	MFXVideoDECODE_DecodeFrameAsync
-	MFXVideoVPP_RunFrameVPPAsync
-	MFXVideoENCODE_EncodeFrameAsync
模块异步工作原理如图2所示。
&#38;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;图2 模块异步化输入输出图
相比于多线程模式，它有几个优点：
-	只需要一次帧同步，而其他两次的异步操作基本上不耗时间，节省了时间。
-	不需要队列的同步操作，提高了效率。
-	不需要多线程，一个线程搞定三个模块，实现复杂度低。
【小结】
-	异步模式对于硬件编解码比较适合。它的效能高，软件复杂度低。在软件编解码中，它的效能和简单串行模式无太多优势，所以可考虑采用多线程模式来实现。
-	多线程模式和异步模式仅仅是提高效率的两种方法，它们之间没有冲突，应用可以根据自身的需求灵活采用，也可以混合运用，提高效率。
]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk-6/">提高Media SDK效率之多线程篇</a>中已经讲述了如何使用多线程提高编解码的效能问题。因为增加了队列（Queue）的创建和维护等附加工作，在多线程情况下程序的复杂性也被加大，那么还有没有其他方面可以采用呢？本文以此为讨论出发点，主要从异步角度出发，讨论如何采用合适的异步方法来提高编解码器的效能问题。</p>
<p>在多线程方案中，我们使用队列（Queue）的同步机制来保证三个模块的协同工作，如图1所示。<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_mulithread_diagram.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_mulithread_diagram.png" alt="" width="662" height="246" class="alignnone size-full wp-image-400003314" /></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图1 模块线程化输入输出图</p>
<p>从图1中，网友不难发现有两个基本的开销点：<br />
-	需要3次同步帧（SyncFrame）来完成一次编解码动作。<br />
-	模块间的2个共享Queue都需要做同步操作。</p>
<p>这两个开销点对于多线程效率和竞争是不利的，那么有什么方法可以剔除或减小这种开销呢？<br />
幸运的是Media SDK提供了异步机制，它提供了三个函数支持相应的三个模块：<br />
-	MFXVideoDECODE_DecodeFrameAsync<br />
-	MFXVideoVPP_RunFrameVPPAsync<br />
-	MFXVideoENCODE_EncodeFrameAsync</p>
<p>模块异步工作原理如图2所示。<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/converter_async_diagram.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/converter_async_diagram.png" alt="" width="577" height="220" class="alignnone size-full wp-image-400003332" /></a>&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图2 模块异步化输入输出图</p>
<p>相比于多线程模式，它有几个优点：<br />
-	只需要一次帧同步，而其他两次的异步操作基本上不耗时间，节省了时间。<br />
-	不需要队列的同步操作，提高了效率。<br />
-	不需要多线程，一个线程搞定三个模块，实现复杂度低。</p>
<p>【小结】<br />
-	异步模式对于硬件编解码比较适合。它的效能高，软件复杂度低。在软件编解码中，它的效能和简单串行模式无太多优势，所以可考虑采用多线程模式来实现。<br />
-	多线程模式和异步模式仅仅是提高效率的两种方法，它们之间没有冲突，应用可以根据自身的需求灵活采用，也可以混合运用，提高效率。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/04/media-sdk-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>漫谈从RISC向IA移植(1)</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/03/riscia1/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/03/riscia1/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 07:11:01 +0000</pubDate>
		<dc:creator>Bruce Chen 陈宇达 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/03/riscia1/</guid>
		<description><![CDATA[计算机已经广泛应用了几十年，许多的传统关键业务也经常传统上就部署在基于RISC的UNIX系统之上。随着计算机技术的不断发展，基于IA架构的解决方案也快速的发展进步，在关键业务领域得到了日益广泛的应用，不断地体现着自己独到的特点和优势。那么，如何从RISC向IA移植呢？经常有客户问到这些，我这里就对移植的方法加以讨论。
一家之言，欢迎板砖。
先说说为什么要移植。
传统上，采用基于RISC的UNIX解决方案主要是基于如下的考虑：
	&#62; 性能
	&#62; 可扩展性
	&#62; 可靠性
	&#62; 安全性
在十几年前，这些的确是RISC的优势，但随着IA架构及相关软件的不断发展，企业环境的不断变化，RISC系统受到了越来越大的挑战：
	&#62; 企业对价格日益敏感，希望尽可能低的价格实现对不断增长的业务的支持
	&#62; 企业对可扩展性持续有着较高需求的同时，希望有足够的灵活性
	&#62; 随着IT基础设施的不断扩张，复杂又高昂的IT维护已成为企业的一大负担
随着IA架构的性能、安全可靠性的快速提升，这些挑战的解决恰恰就是IA架构的强项:
	&#62; 高性能，高性价比: 以目前最新的Xeon 5570为例，根据公开测试的标准SPEC fp/int/jbb，其性能是某RISC品牌对应最新产品的1.9至2.9倍；性价比更是大幅的提升
	&#62; 广泛的软硬件支持: IA架构有着广泛的软硬件支持基础，几乎所有的OEM厂商均有相关的硬件产品，选择空间巨大；也几乎所有的企业应用软件供应商提供对应的可靠的软件版本。
	&#62; 开放的环境，不存在单一供应商的锁定：
	&#62; 可以快速的采用新技术和新应用
下图就是RISC与IA架构的简要对比示意：

正是基于这些考虑，越来越多的解决方案走向了开放的IA架构。
]]></description>
			<content:encoded><![CDATA[<p>计算机已经广泛应用了几十年，许多的传统关键业务也经常传统上就部署在基于RISC的UNIX系统之上。随着计算机技术的不断发展，基于IA架构的解决方案也快速的发展进步，在关键业务领域得到了日益广泛的应用，不断地体现着自己独到的特点和优势。那么，如何从RISC向IA移植呢？经常有客户问到这些，我这里就对移植的方法加以讨论。</p>
<p>一家之言，欢迎板砖。</p>
<p>先说说为什么要移植。</p>
<p>传统上，采用基于RISC的UNIX解决方案主要是基于如下的考虑：<br />
	&gt; 性能<br />
	&gt; 可扩展性<br />
	&gt; 可靠性<br />
	&gt; 安全性</p>
<p>在十几年前，这些的确是RISC的优势，但随着IA架构及相关软件的不断发展，企业环境的不断变化，RISC系统受到了越来越大的挑战：<br />
	&gt; 企业对价格日益敏感，希望尽可能低的价格实现对不断增长的业务的支持<br />
	&gt; 企业对可扩展性持续有着较高需求的同时，希望有足够的灵活性<br />
	&gt; 随着IT基础设施的不断扩张，复杂又高昂的IT维护已成为企业的一大负担</p>
<p>随着IA架构的性能、安全可靠性的快速提升，这些挑战的解决恰恰就是IA架构的强项:<br />
	&gt; 高性能，高性价比: 以目前最新的Xeon 5570为例，根据公开测试的标准SPEC fp/int/jbb，其性能是某RISC品牌对应最新产品的1.9至2.9倍；性价比更是大幅的提升<br />
	&gt; 广泛的软硬件支持: IA架构有着广泛的软硬件支持基础，几乎所有的OEM厂商均有相关的硬件产品，选择空间巨大；也几乎所有的企业应用软件供应商提供对应的可靠的软件版本。<br />
	&gt; 开放的环境，不存在单一供应商的锁定：<br />
	&gt; 可以快速的采用新技术和新应用</p>
<p>下图就是RISC与IA架构的简要对比示意：<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/untitled.jpg"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/untitled-300x146.jpg" alt="" width="300" height="146" class="alignnone size-medium wp-image-400003330" /></a></p>
<p>正是基于这些考虑，越来越多的解决方案走向了开放的IA架构。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/03/riscia1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Core i7/i5 vPro 平台新特性 – Intel® AMT KVM</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/02/01/core-i7i5-vpro-intel-amt-kvm/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/02/01/core-i7i5-vpro-intel-amt-kvm/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 10:57:44 +0000</pubDate>
		<dc:creator>李铎锋--Duofeng Li (Intel)</dc:creator>
				<category><![CDATA[可管理性]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[remote display]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/02/01/core-i7i5-vpro-intel-amt-kvm/</guid>
		<description><![CDATA[      酝酿已久的Intel(R) AMT KVM特性终于在最近发布的最新Intel(R) Core i7 vPro和Core i5 vPro平台上发布了，新的vPro平台除了CPU采用Intel最新的Core i7和Core i5，也要求采用Intel最新的支持Intel(R) AMT 6的芯片组。新平台的信息可以参考Intel官方网站：http://www.intel.com/products/core_vpro/index.htm，下面截图来自此页面。
 

        KVM是Keyboard、Video and Mouse的缩写，KVM设备目前已经被广泛应用。一般的应用模式是：通过KVM设备，同一套键盘、鼠标和显示器可以同时操作多台计算机，能操作的计算机台数取决于使用的KVM设备支持的端口数，一般有4口、8口、16口、24口；但普通的KVM设备比较遗憾的一点是无法通过网络传输，这就限制了键盘、鼠标和显示器与被操作的设备距离不能太远。市场上也有支持跨网络的KVM连接的设备，这样的设置支持KVM Over IP的特性，功能比普通的KVM设备要复杂，可以直接连接到局域网，然后控制台可以通过IP访问KVM设备，然后打开相应的设备就能远程操作。笔者实验室就有一台Avocent AutoView 3200就支持KVM Over IP，可以通过网络远程直接控制多达16台计算机，不过同时只能打开两台机器的界面；另外有一点不是很好的是，如果客户机死机了，远程重启没办法做到，还是需要本地去重置电源；这个设备的价格也是比较昂贵的，一般都要好几万人民币。
        最新Intel(R) Core i7/i5 vPro平台支持的最新Intel(R) AMT的KVM特性就能实现以前类似于KVM Over IP设备的功能，通过Intel(R) AMT KVM，被管理终端机的键盘、鼠标和显示能够通过AMT被重定向到远程控制台；并且结合Intel(R) AMT已有的远程控制的能力，可以在客户端失去响应的情况下远程重启，真正意义上实现了远程操控和管理；另外，结合最近的Intel(R) AMT的Fast Call for Help特性，可以做到跨防火墙远程控制客户机。
        Intel(R) AMT KVM特性使得Intel(R) AMT能够更好的支持更多的使用模式，比如：
               ¨ 客户机端蓝屏时，需要IT操作员帮忙查看蓝屏信息；
               ¨客户机操作系统无法响应或处于修复模式时，其他的基于操作系统的远程显示应用无法工作；
               ¨客户机操作系统还未正常工作，处于远程安装或修复时，随后的重启动作需要远程安装人员确认时；
               ¨ 客户机处于待机(S3)状态时，IT操作员需要远程唤醒并操作；
               ¨客户机平台启动时，需要在BIOS（文本显示）和操作系统（图形显示）启动过程中进行交互，IT操作员可以远程查看和控制整个启动过程。
      基于Intel(R) AMT KVM特性的使用模式绝对不仅仅限于上面提到的几点，只要咱们劳动人民发挥我们的聪明才智，肯定是能够更好的利用起来，以解决不同场景的问题，满足不同用户的要求。笔者相信，Intel(R) AMT KVM新特性是Intel(R) AMT技术发展历史中具有重要里程碑意义的特性，有了此特性，远程操作、远程诊断和远程修复及其引申出来的需求才真正意义上得到了完美解决，也一定能吸引越来越多的IT管理人员的目光，进一步将Intel(R) AMT其他特性应用起来。
        关于Intel(R) AMT KVM特性的更多细节和开发相关的问题，笔者将在随后的文章中进一步介绍，敬请期待………
]]></description>
			<content:encoded><![CDATA[<p>      酝酿已久的Intel(R) AMT KVM特性终于在最近发布的最新Intel(R) Core i7 vPro和Core i5 vPro平台上发布了，新的vPro平台除了CPU采用Intel最新的Core i7和Core i5，也要求采用Intel最新的支持Intel(R) AMT 6的芯片组。新平台的信息可以参考Intel官方网站：<a href="http://www.intel.com/products/core_vpro/index.htm">http://www.intel.com/products/core_vpro/index.htm</a>，下面截图来自此页面。<br />
 <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/KVM_official_02.jpg"><img class="alignnone size-full wp-image-400003326" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/KVM_official_02.jpg" alt="" width="395" height="138" /></a><br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/KVM_official_01.jpg"><img class="alignnone size-full wp-image-400003327" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/02/KVM_official_01.jpg" alt="" width="447" height="61" /></a></p>
<p>        KVM是Keyboard、Video and Mouse的缩写，KVM设备目前已经被广泛应用。一般的应用模式是：通过KVM设备，同一套键盘、鼠标和显示器可以同时操作多台计算机，能操作的计算机台数取决于使用的KVM设备支持的端口数，一般有4口、8口、16口、24口；但普通的KVM设备比较遗憾的一点是无法通过网络传输，这就限制了键盘、鼠标和显示器与被操作的设备距离不能太远。市场上也有支持跨网络的KVM连接的设备，这样的设置支持KVM Over IP的特性，功能比普通的KVM设备要复杂，可以直接连接到局域网，然后控制台可以通过IP访问KVM设备，然后打开相应的设备就能远程操作。笔者实验室就有一台Avocent AutoView 3200就支持KVM Over IP，可以通过网络远程直接控制多达16台计算机，不过同时只能打开两台机器的界面；另外有一点不是很好的是，如果客户机死机了，远程重启没办法做到，还是需要本地去重置电源；这个设备的价格也是比较昂贵的，一般都要好几万人民币。</p>
<p>        最新Intel(R) Core i7/i5 vPro平台支持的最新Intel(R) AMT的KVM特性就能实现以前类似于KVM Over IP设备的功能，通过Intel(R) AMT KVM，被管理终端机的键盘、鼠标和显示能够通过AMT被重定向到远程控制台；并且结合Intel(R) AMT已有的远程控制的能力，可以在客户端失去响应的情况下远程重启，真正意义上实现了远程操控和管理；另外，结合最近的Intel(R) AMT的Fast Call for Help特性，可以做到跨防火墙远程控制客户机。</p>
<p>        Intel(R) AMT KVM特性使得Intel(R) AMT能够更好的支持更多的使用模式，比如：</p>
<p>               ¨ 客户机端蓝屏时，需要IT操作员帮忙查看蓝屏信息；<br />
               ¨客户机操作系统无法响应或处于修复模式时，其他的基于操作系统的远程显示应用无法工作；<br />
               ¨客户机操作系统还未正常工作，处于远程安装或修复时，随后的重启动作需要远程安装人员确认时；<br />
               ¨ 客户机处于待机(S3)状态时，IT操作员需要远程唤醒并操作；<br />
               ¨客户机平台启动时，需要在BIOS（文本显示）和操作系统（图形显示）启动过程中进行交互，IT操作员可以远程查看和控制整个启动过程。</p>
<p>      基于Intel(R) AMT KVM特性的使用模式绝对不仅仅限于上面提到的几点，只要咱们劳动人民发挥我们的聪明才智，肯定是能够更好的利用起来，以解决不同场景的问题，满足不同用户的要求。笔者相信，Intel(R) AMT KVM新特性是Intel(R) AMT技术发展历史中具有重要里程碑意义的特性，有了此特性，远程操作、远程诊断和远程修复及其引申出来的需求才真正意义上得到了完美解决，也一定能吸引越来越多的IT管理人员的目光，进一步将Intel(R) AMT其他特性应用起来。</p>
<p>        关于Intel(R) AMT KVM特性的更多细节和开发相关的问题，笔者将在随后的文章中进一步介绍，敬请期待………</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/02/01/core-i7i5-vpro-intel-amt-kvm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>提高Media SDK效率之多线程篇</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk-6/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk-6/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 08:16:14 +0000</pubDate>
		<dc:creator>Yanqing Wang (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk-6/</guid>
		<description><![CDATA[
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;提高Media SDK效率之初始化设置篇和提高Media SDK效率之内存选择篇中，笔者已经对Media SDK的两个重要配置部分进行了分析和总结。本节，我们将着重讨论如何使用多线程技术提高视频Converter的效能（一种视频的常用应用）。
在运用Media SDK进行格式转换时，一般要涉及三大模块，他们是Decoder，VPP和Encoder，数据输入输出如图1所示。
 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;图1 基本数据输入输出图
从图1可以看出，每经过一个模块，都要对数据进行同步操作。在此期间，其他两个模块是处于空闲状态，是一个典型的串行处理过程。对于英特尔的多核技术，它的多核利用率是最低的，相应的效率也较差。
那么如何对现有流程进行多线程化呢？
本文提供了一种最简单的方法，即对每个模块线程化。它在实际运用中并非是最佳方案，之所以采用它，仅仅是为了提供一种思路。请参考图2所示。
 
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;图2 模块线程化输入输出图
图2将Decoder，VPP和Encoder三个模块分别线程化，在彼此之间以队列（queue）为数据交换。
简单的工作模式如下：
-	若队列为空，后级模块等待数据。
-	若队列被填充，前级模块通知后级模块。
-	若无输入数据，前级模块通知后级模块结束工作，后自行了断。
虽然这种线程化的工作增加的程序的复杂性，但是对于赢得的性能而言是值得的。在理想状态下，我们看到三个模块的并行工作，转化时间的长短取决于最为耗时模块。
【小结】
-	Media SDK仅仅提供硬件加速能力，线程化工作展开于具体应用。
-	三个模块线程化仅仅是一种简单参考实现，不是最佳方案。如何充分利用英特尔的多核技术，应该建立在具体分析的基础之上。英特尔提供了丰富的性能检测和优化工具，他们能够帮助程序员找出关键问题所在。
-	VPP模块是可选的，如果应用没有采用，就将Decoder后的队列直接连接到Encoder之前。
]]></description>
			<content:encoded><![CDATA[<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://software.intel.com/zh-cn/blogs/2010/01/15/media-sdk-3/">提高Media SDK效率之初始化设置篇</a>和<a href="http://software.intel.com/zh-cn/blogs/2010/01/21/media-sdk-4/">提高Media SDK效率之内存选择篇</a>中，笔者已经对Media SDK的两个重要配置部分进行了分析和总结。本节，我们将着重讨论如何使用多线程技术提高视频Converter的效能（一种视频的常用应用）。</p>
<p>在运用Media SDK进行格式转换时，一般要涉及三大模块，他们是Decoder，VPP和Encoder，数据输入输出如图1所示。<br />
 <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_squence_diagram.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_squence_diagram.png" alt="" width="577" height="220" class="alignnone size-full wp-image-400003313" /></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图1 基本数据输入输出图</p>
<p>从图1可以看出，每经过一个模块，都要对数据进行同步操作。在此期间，其他两个模块是处于空闲状态，是一个典型的串行处理过程。对于英特尔的多核技术，它的多核利用率是最低的，相应的效率也较差。</p>
<p><strong>那么如何对现有流程进行多线程化呢？</strong></p>
<p>本文提供了一种最简单的方法，即对每个模块线程化。它在实际运用中并非是最佳方案，之所以采用它，仅仅是为了提供一种思路。请参考图2所示。<br />
 <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_mulithread_diagram.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/01/converter_mulithread_diagram.png" alt="" width="662" height="246" class="alignnone size-full wp-image-400003314" /></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图2 模块线程化输入输出图</p>
<p>图2将Decoder，VPP和Encoder三个模块分别线程化，在彼此之间以队列（queue）为数据交换。<br />
简单的工作模式如下：<br />
-	若队列为空，后级模块等待数据。<br />
-	若队列被填充，前级模块通知后级模块。<br />
-	若无输入数据，前级模块通知后级模块结束工作，后自行了断。</p>
<p>虽然这种线程化的工作增加的程序的复杂性，但是对于赢得的性能而言是值得的。在理想状态下，我们看到三个模块的并行工作，转化时间的长短取决于最为耗时模块。</p>
<p>【小结】<br />
-	Media SDK仅仅提供硬件加速能力，线程化工作展开于具体应用。<br />
-	三个模块线程化仅仅是一种简单参考实现，不是最佳方案。如何充分利用英特尔的多核技术，应该建立在具体分析的基础之上。英特尔提供了丰富的性能检测和优化工具，他们能够帮助程序员找出关键问题所在。<br />
-	VPP模块是可选的，如果应用没有采用，就将Decoder后的队列直接连接到Encoder之前。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/01/28/media-sdk-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>英特尔平台上使用IPP高性能库加速软件并行化开发（6）</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/01/27/ipp6/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/01/27/ipp6/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 05:44:37 +0000</pubDate>
		<dc:creator>Bruce Chen 陈宇达 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/01/27/ipp6/</guid>
		<description><![CDATA[写了这么多关于IPP的文章，很多同学在问，IPP性能提升的效果到底怎么样？我这里就写写IPP的性能表现，也算是IPP文章的收山之作了，来个漂亮的尾巴。
这里以P4为例（也有最新平台的数据，性能表现也很好，但拿不准是不是最新的数据公布处理太敏感，就还是用这个吧），都是用的基本优化后的标准C算法代码，使用IPP之后，跟之前相比：
Video处理性能平均提升300%
Audio处理性能平均提升200%
Image处理性能平均提升260%
向量处理性能平均提升300%
信号处理性能平均提升180%
字符串处理性能平均提升120%
加解密处理性能平均提升30%
...
以我个人的经验，客户的代码用IPP改写后，性能提升多数在1倍以上，如果只有百分之几十，多半是没有使用好，还有空间。
IPP另外的十分明显的好处，就是随着英特尔最新CPU的发布而同步更新，使用者免去了汇编之苦，就可以享受到最新指令集的优势。
好了，就这么多，继续工作了。IPP在英特尔网站上有1个月试用版的下载，欢迎试用，欢迎讨论！
]]></description>
			<content:encoded><![CDATA[<p>写了这么多关于IPP的文章，很多同学在问，IPP性能提升的效果到底怎么样？我这里就写写IPP的性能表现，也算是IPP文章的收山之作了，来个漂亮的尾巴。</p>
<p>这里以P4为例（也有最新平台的数据，性能表现也很好，但拿不准是不是最新的数据公布处理太敏感，就还是用这个吧），都是用的基本优化后的标准C算法代码，使用IPP之后，跟之前相比：<br />
Video处理性能平均提升300%<br />
Audio处理性能平均提升200%<br />
Image处理性能平均提升260%<br />
向量处理性能平均提升300%<br />
信号处理性能平均提升180%<br />
字符串处理性能平均提升120%<br />
加解密处理性能平均提升30%<br />
...</p>
<p>以我个人的经验，客户的代码用IPP改写后，性能提升多数在1倍以上，如果只有百分之几十，多半是没有使用好，还有空间。</p>
<p>IPP另外的十分明显的好处，就是随着英特尔最新CPU的发布而同步更新，使用者免去了汇编之苦，就可以享受到最新指令集的优势。</p>
<p>好了，就这么多，继续工作了。IPP在英特尔网站上有1个月试用版的下载，欢迎试用，欢迎讨论！</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/01/27/ipp6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于科学计算中的数值误差问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/01/26/400003305/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/01/26/400003305/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 07:51:28 +0000</pubDate>
		<dc:creator>甘驰 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[HPC 精度 误差]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/01/26/400003305/</guid>
		<description><![CDATA[最近看到有开发HPC应用的程序员反映换了编译器后，新程序的结果不正确。我不禁想起20年前在16位IBM PC AT/XT台式机上开发CAD/CAM程序, 程序在计算边界状况时，如两圆柱的轴夹角为1分求交线，结果经常匪夷所思，都是精度惹得祸。进入64bit时代同样的问题仍然存在，单次运算的精度提高了，但HPC程序中的大量的迭代计算，累积了误差，导致结果不同。我读了Intel同事的文章（http://software.intel.com/en-us/articles/consistency-of-floating-point-results-using-the-intel-compiler），略有所得，与大家分享。
人们要求结果的复现性有以下几方面，
-同一程序，同一数据集，执行若干次的结果相同（近）
-同一代码，不同编译选项产生的程序，相同的数据集，执行的结果相同（近）
-同一代码，不同编译器产生的程序，相同的数据集，执行的结果相同（近）
-同一代码，相同的数据集，在不同架构的CPU上执行的结果相同（近）
最好运行速度也要快。这些要求有时是相互矛盾的。让我们先分析计算结果有差别的原因，注意这里我用了差别，而不是误差。
首先，通常十进制的浮点数用二进制数表示时就有误差，便有了‘原罪’。
其二，计算机运算是不符合结合律的，如A+B+C不一定等于A+(B+C)。当A= -B且C为极小值时，A+B+C=C，但A+(B+C)=0，极小值C和B相加时由于精度限制，被忽略了或者说表示B的有效位不能包含C的值；但A+B=0,再加C后，结果为C。当你多线程或多进程化程序运行时，原来的数据被切成几分，分给不同的进程/线程执行，于是原先的次序被打破，用MPI或OpenMP的程序都有引入的这类潜在的结果差别。
其三，X87 FPU是以80位（1位符号，15位指数，64位数值）、扩展双精度浮点数运算的。SIMD执行单元可能不是（查遍手册，未见答案，至少其数据是以64位存放的）。
其四，四舍五入，(a) 1.0001 0000 1000 0011 1001 0111E2 101以单精度数表示时需要四舍五入，因为其数值有25位，超过单精度浮点数的24位。根据系统设置，有四种模式可选，
-Round to nearest (even) --- 选精度误差最小的
-Round down (toward −∞) -- 选精度误差最小的, 但不大于原数
-Round up (toward +∞) --选精度误差最小的, 但不小于原数
-Round toward zero (Truncate) --选精度误差最小的, 但其绝对值不大于原数
其五，Flush-to-zero 和 denormal-to-zero. 如设定flush-to-zero, 当浮点运算发生underflow时，返回0值而不是像IEEE754要求的，返回非正规数据（denormalized data），这主要是为了提升性能。Denormal-to-zero是将非正规数据操作数置零，也是为性能。
 其六，不良的编程习惯。如变量不置初值等
我的同事将随后发如何巧用Intel编译器的选项避免结果差别，和如何发现导致结果差别的代码。
]]></description>
			<content:encoded><![CDATA[<p>最近看到有开发HPC应用的程序员反映换了编译器后，新程序的结果不正确。我不禁想起20年前在16位IBM PC AT/XT台式机上开发CAD/CAM程序, 程序在计算边界状况时，如两圆柱的轴夹角为1分求交线，结果经常匪夷所思，都是精度惹得祸。进入64bit时代同样的问题仍然存在，单次运算的精度提高了，但HPC程序中的大量的迭代计算，累积了误差，导致结果不同。我读了Intel同事的文章（<a href="http://software.intel.com/en-us/articles/consistency-of-floating-point-results-using-the-intel-compiler">http://software.intel.com/en-us/articles/consistency-of-floating-point-results-using-the-intel-compiler</a>），略有所得，与大家分享。</p>
<p>人们要求结果的复现性有以下几方面，<br />
-同一程序，同一数据集，执行若干次的结果相同（近）<br />
-同一代码，不同编译选项产生的程序，相同的数据集，执行的结果相同（近）<br />
-同一代码，不同编译器产生的程序，相同的数据集，执行的结果相同（近）<br />
-同一代码，相同的数据集，在不同架构的CPU上执行的结果相同（近）<br />
最好运行速度也要快。这些要求有时是相互矛盾的。让我们先分析计算结果有差别的原因，注意这里我用了差别，而不是误差。</p>
<p>首先，通常十进制的浮点数用二进制数表示时就有误差，便有了‘原罪’。</p>
<p>其二，计算机运算是不符合结合律的，如A+B+C不一定等于A+(B+C)。当A= -B且C为极小值时，A+B+C=C，但A+(B+C)=0，极小值C和B相加时由于精度限制，被忽略了或者说表示B的有效位不能包含C的值；但A+B=0,再加C后，结果为C。当你多线程或多进程化程序运行时，原来的数据被切成几分，分给不同的进程/线程执行，于是原先的次序被打破，用MPI或OpenMP的程序都有引入的这类潜在的结果差别。</p>
<p>其三，X87 FPU是以80位（1位符号，15位指数，64位数值）、扩展双精度浮点数运算的。SIMD执行单元可能不是（查遍手册，未见答案，至少其数据是以64位存放的）。</p>
<p>其四，四舍五入，(<em>a</em>) 1.0001 0000 1000 0011 1001 0111E2 101以单精度数表示时需要四舍五入，因为其数值有25位，超过单精度浮点数的24位。根据系统设置，有四种模式可选，<br />
-Round to nearest (even) --- 选精度误差最小的<br />
-Round down (toward −∞) -- 选精度误差最小的, 但不大于原数<br />
-Round up (toward +∞) --选精度误差最小的, 但不小于原数<br />
-Round toward zero (Truncate) --选精度误差最小的, 但其绝对值不大于原数</p>
<p>其五，Flush-to-zero 和 denormal-to-zero. 如设定flush-to-zero, 当浮点运算发生underflow时，返回0值而不是像IEEE754要求的，返回非正规数据（denormalized data），这主要是为了提升性能。Denormal-to-zero是将非正规数据操作数置零，也是为性能。</p>
<p> 其六，不良的编程习惯。如变量不置初值等</p>
<p>我的同事将随后发如何巧用Intel编译器的选项避免结果差别，和如何发现导致结果差别的代码。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/01/26/400003305/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>读针对AVX优化代码 --- 优化issue port的使用</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/01/26/avx-issue-port/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/01/26/avx-issue-port/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 07:50:13 +0000</pubDate>
		<dc:creator>甘驰 (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[AVX]]></category>
		<category><![CDATA[issue port]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/01/26/avx-issue-port/</guid>
		<description><![CDATA[本文中的issue port专指CPU内部向其他执行单元(ALU, SSE MUL, DIV, Load, STD…)发送指令的通道，在Intel Micro Architectur(Sandy Bridge)中共有6个ports，port2,3,4负责存储单元，port0,1,5负责计算单元。若干计算单元会共享一个port，由于每个issue port只能同时向一个单元发送指令，故有时它们成为瓶颈，特别是port0,1,5。选择合适的指令来避免，如你的代码中大量用到shuffles指令，它们只能通过port5被发送，所以你要用vmovsldup ymm2, [mem]代替vmovsldup ymm2, ymm3来准备数据, 因为前者通过load port(2,3)发送，而后者通过port5。
 Intel® 64 and IA-32 Architectures Optimization Reference Manual（248966）的54页列出了(Nehalem)issue port 和执行单元的对应关系。下表建立执行单元与port的关系



Executable operations
Port


Integer ALU
0,1,5


Integer Shift
0,5


Integer MUL
1


Integer LEA
1


Integer SIMD ALU
0,1,5


Integer SIMD Shift
1


Integer SIMD Shuffle
0,5


StringCompare
1


FP ADD
1


(SP) FP MUL
0


(DP) FP MUL
0


FP MUL(X87)
0


FP/SIMD/SSE2 Move &#38; Logic
0,5


FP Shuffle
0


DIV/SQRT
0


JMP
5



当你的程序大量使用那些只有一个issue port能发送的指令，要引起注意。当然Intel编译器会帮你优化，除非你直接写汇编。
]]></description>
			<content:encoded><![CDATA[<p>本文中的issue port专指CPU内部向其他执行单元(ALU, SSE MUL, DIV, Load, STD…)发送指令的通道，在Intel Micro Architectur<strong>(Sandy Bridge)</strong>中共有6个ports，port2,3,4负责存储单元，port0,1,5负责计算单元。若干计算单元会共享一个port，由于每个issue port只能同时向一个单元发送指令，故有时它们成为瓶颈，特别是port0,1,5。选择合适的指令来避免，如你的代码中大量用到shuffles指令，它们只能通过port5被发送，所以你要用vmovsldup ymm2, [mem]代替vmovsldup ymm2, ymm3来准备数据, 因为前者通过load port(2,3)发送，而后者通过port5。</p>
<p> Intel® 64 and IA-32 Architectures Optimization Reference Manual（248966）的54页列出了<strong>(Nehalem)</strong><strong>i</strong>ssue port 和执行单元的对应关系。下表建立执行单元与port的关系</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="284" valign="top"><strong>Executable operations</strong></td>
<td width="131" valign="top"><strong>Port</strong></td>
</tr>
<tr>
<td width="284" valign="top">Integer ALU</td>
<td width="131" valign="top">0,1,5</td>
</tr>
<tr>
<td width="284" valign="top">Integer Shift</td>
<td width="131" valign="top">0,5</td>
</tr>
<tr>
<td width="284" valign="top">Integer MUL</td>
<td width="131" valign="top">1</td>
</tr>
<tr>
<td width="284" valign="top">Integer LEA</td>
<td width="131" valign="top">1</td>
</tr>
<tr>
<td width="284" valign="top">Integer SIMD ALU</td>
<td width="131" valign="top">0,1,5</td>
</tr>
<tr>
<td width="284" valign="top">Integer SIMD Shift</td>
<td width="131" valign="top">1</td>
</tr>
<tr>
<td width="284" valign="top">Integer SIMD Shuffle</td>
<td width="131" valign="top">0,5</td>
</tr>
<tr>
<td width="284" valign="top">StringCompare</td>
<td width="131" valign="top">1</td>
</tr>
<tr>
<td width="284" valign="top">FP ADD</td>
<td width="131" valign="top">1</td>
</tr>
<tr>
<td width="284" valign="top">(SP) FP MUL</td>
<td width="131" valign="top">0</td>
</tr>
<tr>
<td width="284" valign="top">(DP) FP MUL</td>
<td width="131" valign="top">0</td>
</tr>
<tr>
<td width="284" valign="top">FP MUL(X87)</td>
<td width="131" valign="top">0</td>
</tr>
<tr>
<td width="284" valign="top">FP/SIMD/SSE2 Move &amp; Logic</td>
<td width="131" valign="top">0,5</td>
</tr>
<tr>
<td width="284" valign="top">FP Shuffle</td>
<td width="131" valign="top">0</td>
</tr>
<tr>
<td width="284" valign="top">DIV/SQRT</td>
<td width="131" valign="top">0</td>
</tr>
<tr>
<td width="284" valign="top">JMP</td>
<td width="131" valign="top">5</td>
</tr>
</tbody>
</table>
<p>当你的程序大量使用那些只有一个issue port能发送的指令，要引起注意。当然Intel编译器会帮你优化，除非你直接写汇编。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/01/26/avx-issue-port/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
