<?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; Hao Jiang (Intel)</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/hao-jiang/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +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>ICC 编译 Google Mock 和 Google Test 的问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 05:56:52 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[12.1]]></category>
		<category><![CDATA[C++ TR1]]></category>
		<category><![CDATA[Google Mock]]></category>
		<category><![CDATA[Google Test]]></category>
		<category><![CDATA[Intel C++]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/</guid>
		<description><![CDATA[最近发现 Google Test (Google C++ Testing Framework 的非正式称谓) 非常受欢迎，很多公司的研发团队都在使用它编写 C++ 测试案例。其中包括著名的 Chromium project (熟悉Chrome 浏览器和操作系统的，对这个名字一定不会陌生)，国内不少基于 C++ 的大型项目在测试中也会经常使用它。 Google Test 跨平台的好处不用多说，单是简单易用，就能极大提高编写测试案例的效率。与此相关，Google的工程师们还提供了另外一个开源项目 Google C++ Mocking Framework (简称 Google Mock)， 它也是基于 Google Test的。 如果我们当前的工程已经使用 Intel C++ 编译器作为缺省的编译器，此时加入基于 Google Mock 或者 Goolge Test 编写的测试代码时，可能会发现如下的编译错误信息： /usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: name followed by "::" must be a class or namespace name struct MatcherTuple&#60; [...]]]></description>
			<content:encoded><![CDATA[<p>最近发现 Google Test (Google C++ Testing Framework 的非正式称谓) 非常受欢迎，很多公司的研发团队都在使用它编写 C++ 测试案例。其中包括著名的 Chromium project (熟悉Chrome 浏览器和操作系统的，对这个名字一定不会陌生)，国内不少基于 C++ 的大型项目在测试中也会经常使用它。</p>
<p>Google Test 跨平台的好处不用多说，单是简单易用，就能极大提高编写测试案例的效率。与此相关，Google的工程师们还提供了另外一个开源项目 Google C++ Mocking Framework (简称 Google Mock)， 它也是基于 Google Test的。</p>
<p>如果我们当前的工程已经使用 Intel C++ 编译器作为缺省的编译器，此时加入基于 Google Mock 或者 Goolge Test 编写的测试代码时，可能会发现如下的编译错误信息：</p>
<blockquote><p>/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: name followed by "::" must be a class or namespace name<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                              ^<br />
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                                         ^<br />
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier<br />
  struct MatcherTuple&lt; ::std::tr1::tuple &gt; {<br />
                                           ^<br />
…<br />
compilation aborted for UnitTest/xxxTestSuite.cpp (code 4)</p></blockquote>
<p>这类错误产生的原因，其实在于上诉 Google Mock 自身的代码需要编译器能够提供对 C++ Technical Report 1  (简称 TR 1) 标准扩展 的支持。注意，TR1 只是 C++ Library Extensions。</p>
<p>而 Intel C++ 编译器从 2011 年 8 月发布的版本 <strong>C++ Composer XE 2011 update 6</strong> (也就是常说的 12.1 版本) 起，开始正式对 TR1的支持，特别是支持编译 gcc 或者 MSVC 提供的有关 TR1 的头文件。 当然在编译的时候，还请务必要添加选项 <strong>–std=C++0x</strong> 来激活 Intel 编译器对标准扩展的支持。</p>
<p>所以简单地说，如果发现错误消息中包含类似 ::std::tr1 这类的，估计多半是还在使用比较早期的版本，例如 11.x，10.x 等等。 请尽早升级到最新的编译器版本，同时使用 –std=c++0x 吧。</p>
<p>附录：<br />
1) Google C++ Testing Framework: http://code.google.com/p/googletest/<br />
2）Google C++ Mocking Framework: http://code.google.com/p/googlemock/<br />
3）C++ Technical Report 1 (TR1): http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1<br />
C++ Technical Report 1 (TR1) is the common name for ISO/IEC TR 19768, C++ Library Extensions, which was a document proposing additions to the C++ standard library for the C++03 language standard. The additions include regular expressions, smart pointers, hash tables, and random number generators.<br />
4) Intel Software Network Knowledge Base (KB): http://software.intel.com/en-us/articles/some-gcc-headers-will-not-compile-due-to-use-of-c0x-variadic-templates/</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/23/icc-google-mock-google-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>软件工具旧版本的下载链接在哪里？</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/05/17/400007550/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/05/17/400007550/#comments</comments>
		<pubDate>Tue, 17 May 2011 03:15:28 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[下载链接]]></category>
		<category><![CDATA[旧版本]]></category>
		<category><![CDATA[注册中心]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/05/17/400007550/</guid>
		<description><![CDATA[无论你使用哪个英特尔的软件开发工具 (C/C++, Fortran编译器，IPP，MKL，VTune 等等)，都可以从英特尔软件注册中心（https://registrationcenter.intel.com）获得最新的更新包。 通常情况下，你可以获得从注册日期开始为期一年的免费升级。当然老的版本依然可以继续使用，而不受到任何限制。 2010年底，英特尔发布了全新的并行开发套件 Parallel Studio XE，并且将各个组件的最新的软件版本号从 11.1 改为了按照年份命名。因此你会发现，注册中心的下载页面上看到的软件版本，缺省就都是 2011 了。 有些时候，我们会因为兼容性的问题（往往是由于第三方库的限制，或者某个特定的功能) 不得不需要下载更早期的版本。 这时候，我们就得自己动手，在下载页面的下方，从下拉菜单 “Release" 中选择希望的主版本号，然后再选择具体的某个版本（即“Build”）。 下面以 Intel® Visual Fortran Compiler Professional Edition for Windows* 为例，当进入下载页面时缺省显示的是版本 2011 的下载链接. 如果你需要选择其它版本 （例如 11.1），就需要从图示红色圆圈中的下拉菜单中自行选择 11.1， 然后下载页面就会自动变成 11.1 版本的最近一次更新包的下载链接。 然后你还可以进一步继续选择 11.1 版本其他的次新发布包。 如果觉得页面的文字看上去不那么亲切，没关系，可以在右上角的黄色箭头处，选择更新页面的缺省显示语言。再进入的时候，就能看到熟悉的中文了。 现在你再也不用担心了吧，旧版本的下载链接就在那里啊。]]></description>
			<content:encoded><![CDATA[<p>无论你使用哪个英特尔的软件开发工具 (C/C++, Fortran编译器，IPP，MKL，VTune 等等)，都可以从<strong>英特尔软件注册中心</strong>（<a href="https://registrationcenter.intel.com/">https://registrationcenter.intel.com</a>）获得最新的更新包。</p>
<p>通常情况下，你可以获得从注册日期开始为期一年的免费升级。当然老的版本依然可以继续使用，而不受到任何限制。</p>
<p>2010年底，英特尔发布了全新的并行开发套件 <strong>Parallel Studio XE</strong>，并且将各个组件的最新的软件版本号从 11.1 改为了按照年份命名。因此你会发现，注册中心的下载页面上看到的软件版本，缺省就都是 2011 了。 </p>
<p>有些时候，我们会因为兼容性的问题（往往是由于第三方库的限制，或者某个特定的功能) 不得不需要下载更早期的版本。</p>
<p>这时候，我们就得自己动手，在下载页面的下方，从下拉菜单 “Release" 中选择希望的主版本号，然后再选择具体的某个版本（即“Build”）。</p>
<p>下面以 Intel® Visual Fortran Compiler Professional Edition for Windows* 为例，当进入下载页面时缺省显示的是版本 2011 的下载链接. </p>
<p>如果你需要选择其它版本 （例如 11.1），就需要从图示红色圆圈中的下拉菜单中自行选择 11.1， 然后下载页面就会自动变成 11.1 版本的最近一次更新包的下载链接。 然后你还可以进一步继续选择 11.1 版本其他的次新发布包。</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/05/IRC_2.jpg"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/05/IRC_2-1024x640.jpg" alt="下载页面的范本" width="640" height="480" class="alignnone size-large wp-image-400007551" /></a></p>
<p>如果觉得页面的文字看上去不那么亲切，没关系，可以在右上角的黄色箭头处，选择更新页面的缺省显示语言。再进入的时候，就能看到熟悉的中文了。</p>
<p>现在你再也不用担心了吧，旧版本的下载链接就在那里啊。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/05/17/400007550/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Co-Array Fortran 看上去很美 ？</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/05/09/co-array-fortran/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/05/09/co-array-fortran/#comments</comments>
		<pubDate>Mon, 09 May 2011 07:36:33 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[Co-array Fortran]]></category>
		<category><![CDATA[Intel Fortran Composer XE]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/05/09/co-array-fortran/</guid>
		<description><![CDATA[Co-Array Fortran（下面简称 CAF，中文暂称为”Fortran的集合数组阵列扩展“），最初是作为 Fortran 95 一个小小的扩展，由 Numrich 和 Reid 发表于 1998年 ACM Fortran Forum 17卷第2期的 “Co-Array Fortran for Parallel Programming” 文章中。 直到 2005 年的5月，国际标准组织 Fortran 委员会决定将 CAF 包含在下一版本的 Fortran 语言规范草案中 (也就是今天我们常说的 Fortran 2008). 为什么今天要讨论和学习 CAF 呢？ 因为它提供了一种非常简洁、直观的标注方法，来处理那些通常必须要通过消息传递（message-passing）模型来处理的数据分解问题；同时它本身使用的是自然的，类似于 Fortran 的语法。 这种语法独立于硬件架构，可以在分布式内存系统，共享内存系统和集群系统等中得到使用。 有了 CAF 扩展之后，传统的 Fortran 语言就变成了一个稳定、高效的并行编程语言。熟悉 Fortran 语言的编程者只需要学习和掌握几条新的语法规则，而这些新规则解决了任何并行编程模型中都必须克服的几个基本问题：任务分发，和数据分发。 先来看看任务分发。一个 CAF 的程序被复制为固定数量的若干份，每一个复制拥有自己独立的数据对象。程序的每一个内存复本被称作一个“镜像” (image). 每一个镜像都是独立地异步执行，因此各个镜像执行的路径也是不相同的。程序员可以通过若干种方法决定镜像的实际执行路径，比如说借助每一个镜像唯一的“索引值"(index), 使用通常的Fortran控制语句；或者通过显式的同步。 而在同步之间的代码段，编译器可以自由地使用各种常用的优化技巧，就好像只有一个镜像存在。 接下来，我们必须要考虑数据的分发过程。 [...]]]></description>
			<content:encoded><![CDATA[<p>Co-Array Fortran（下面简称 CAF，中文暂称为”Fortran的集合数组阵列扩展“），最初是作为 Fortran 95 一个小小的扩展，由 Numrich 和 Reid 发表于 1998年 ACM Fortran Forum 17卷第2期的 “Co-Array Fortran for Parallel Programming” 文章中。 </p>
<p>直到 2005 年的5月，国际标准组织 Fortran 委员会决定将 CAF 包含在下一版本的 Fortran 语言规范草案中 (也就是今天我们常说的 Fortran 2008). </p>
<p>为什么今天要讨论和学习 CAF 呢？ </p>
<p>因为它提供了一种非常简洁、直观的标注方法，来处理那些通常必须要通过消息传递（message-passing）模型来处理的数据分解问题；同时它本身使用的是自然的，类似于 Fortran 的语法。 这种语法独立于硬件架构，可以在分布式内存系统，共享内存系统和集群系统等中得到使用。</p>
<p>有了 CAF 扩展之后，传统的 Fortran 语言就变成了一个稳定、高效的并行编程语言。熟悉 Fortran 语言的编程者只需要学习和掌握几条新的语法规则，而这些新规则解决了任何并行编程模型中都必须克服的几个基本问题：任务分发，和数据分发。</p>
<p>先来看看任务分发。一个 CAF 的程序被复制为固定数量的若干份，每一个复制拥有自己独立的数据对象。程序的每一个内存复本被称作一个“镜像” (image).  每一个镜像都是独立地异步执行，因此各个镜像执行的路径也是不相同的。程序员可以通过若干种方法决定镜像的实际执行路径，比如说借助每一个镜像唯一的“索引值"(index), 使用通常的Fortran控制语句；或者通过显式的同步。 而在同步之间的代码段，编译器可以自由地使用各种常用的优化技巧，就好像只有一个镜像存在。</p>
<p>接下来，我们必须要考虑数据的分发过程。 Fortran语言的Co-array扩展，允许程序员可以使用一个非常类似于通常 Fortran 数组表示的语法，来表明不同内存镜像之间的关系，从而实现数据的分发。 在如下的例子中，一个新的对象，coarray ("集合数组“), 被添加到原有的语言规范中：</p>
<p><code>    REAL, DIMENSION(N)[*] :: X,Y<br />
    X(:) = Y(:)[Q]</code></p>
<p>它声明了每个镜像都包含两个 real 类型的，大小为 N 的数组。 如果在每个镜像中的 Q 变量具有相同的值，那么赋值语句的效果就是，每个镜像都从镜像 Q 的数组 Y 复制数据，并且将它们复制到本地的数组 X 中。</p>
<p>在圆括号 "()" 中的数组下标，在一个内存镜像的范围内，继续遵循通常的 Fortran 规范。 而在方括号 "[]" 中的数组下标, 则提供了一种非常便捷的标注方法，来表明访问不同镜像的对象。 一个指向co-array的不包含方括号的引用，会被指向在当前本地内存中正在运行的镜像中的对象，因此 co-arrary仅当需要时才会使用，大部分代码和原先的没有什么区别。</p>
<p>如果和原有的 Fortran 90 数组的语法相结合，CAF 可以展现给我们一个非常强大的，却十分简洁的途径，来表达如何进行远程内存访问。下面是更多的一些例子：</p>
<p><code>      A       = B[PE]  ! 从 B[PE] 中取值<br />
      B[PE]   = A      ! 复制给 B[PE]<br />
      B[:]    = A      ! 广播 A 的值<br />
      B[LIST] = A      ! 广播 A 的值，只针对由LIST定义的所有镜像的一个子集<br />
      C(:)    = B[:]   ! 收集所有镜像的 B<br />
      S = MINVAL(Y[:]) ! 求所有镜像的变量 Y 的最小值 (reduce)<br />
      B(1:M)[1:N] = S  ! 标量 S , 按照数组形状 (1:M,1:N) 的方式赋值</code></p>
<p>此外， CAF 还增加了若干 内部函数 （intrinsics）， 比如：函数 NUM_IMAGES() 返回了当前程序镜像的总数量；而 函数 THIS_IMAGE() 返回了当前镜像的索引值( 显然应该在 1 和 NUM_IMAGES() 之间）；而 子程序 SYNC_ALL() 则提供了一个全局的边界，要求在此之前的所有镜像中的所有操作必须全部结束后，任何镜像中后于此边界的语句才能继续执行。 当然通常情况下，只等待与之有关联的镜像会更加合适，执行速度也更快，SYNC_ALL(WAIT=LIST) 就提供了这种功能。 START_CRITICAL 和 END_CRITICAL 则提供了关键区的保护。</p>
<p>镜像和集合数组的同步，是 CAF 程序中最最重要的部分。例如，在下面这个例子中，我们需要实现一个固定顺序的累积求和：<br />
<code><br />
      REAL SUM[*]<br />
      CALL SYNC_ALL( WAIT=1 )<br />
      DO IMG= 2,NUM_IMAGES()<br />
        IF (IMG==THIS_IMAGE()) THEN<br />
           SUM = SUM + SUM[IMG-1]<br />
        ENDIF<br />
        CALL SYNC_ALL( WAIT=IMG )<br />
      ENDDO</code></p>
<p>虽然使用 SYNC_ALL 时仅仅等待某个正在运行中的镜像能够提高性能，但是我们仍然需要有 NUM_IMAGES() 次全局的同步。 可以考虑一个更好的方案，可以最小程度的减少同步</p>
<p><code>      REAL SUM[*]<br />
      ME = THIS_IMAGE()<br />
      IF (ME.GT.1) THEN<br />
         SYNC IMAGES ( (/ME-1,ME/) )<br />
         SUM = SUM + SUM[ME-1]<br />
      ENDIF<br />
      IF (ME.LT.NUM_IMAGES()) THEN<br />
         SYNC IMAGES ( (/ME,ME+1/) )<br />
      ENDIF</code></p>
<p>现在每一个镜像最多只参与两次同步，并且仅仅发生在镜像顺序前后相邻的两个镜像之间。注意第一个 SYNC IMAGES 调用会和前一个镜像的第二个 SYNC IMAGES 调用匹配。这也充分展示了 CAF 同步机制的好处， 不仅可以提高数据并行算法的性能，还可以提供针对数据并行的隐式的程序流程控制。</p>
<p>现在你应该相信，Co-Array Fortran 确实不错吧。</p>
<p>后面我们会介绍如何结合 Intel Fortran Composer XE 2011 来学习和发挥 CAF 的巨大能量。</p>
<p>顺便说一句， 如果希望得到“最终”版本的 Fortran 2008 标准的电子版本，当然是英文的，请到英特尔软件网络（<a href="http://software.intel.com/en-us/forums/">http://software.intel.com/en-us/forums/</a>）相关的 Fortran 论坛中找吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/05/09/co-array-fortran/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让Windows 7客户端与Samba 服务器正常工作</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/10/29/windows-7samba/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/10/29/windows-7samba/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 02:39:15 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>
		<category><![CDATA[NTLM]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/10/29/windows-7samba/</guid>
		<description><![CDATA[一般很多Linux文件服务器都会开通Samba服务，这样就可以让Windows客户端正常访问了。 最近一台实验机器升级到Windows 7，发现无法正常访问Samba服务器，总是报告登录名或者密码错误。而同样的帐号和密码在XP系统上却能正常访问。 原因是Windows 7升级了缺省的NTLM安全级别，从而无法和原先的Samba服务兼容。 解决的办法是： i) 先打开 Control Panel -&#62; Administrative Tools -&#62; Local Security Policy -&#62; Local Policies -&#62; Security Options , ii) 然后改变两个缺省的安全选项设置: 1) Network security: LAN Manager authentication level : change to "Send LM &#38; NTLM responses" ; 2) Network security: Minimum session security for NTLM SSP based (including secure RPC) [...]]]></description>
			<content:encoded><![CDATA[<p>一般很多Linux文件服务器都会开通Samba服务，这样就可以让Windows客户端正常访问了。</p>
<p>最近一台实验机器升级到Windows 7，发现无法正常访问Samba服务器，总是报告登录名或者密码错误。而同样的帐号和密码在XP系统上却能正常访问。</p>
<p>原因是Windows 7升级了缺省的NTLM安全级别，从而无法和原先的Samba服务兼容。</p>
<p>解决的办法是：</p>
<p>i) 先打开 Control Panel -&gt; Administrative Tools -&gt; Local Security Policy -&gt; Local Policies -&gt; Security Options ,</p>
<p>ii) 然后改变两个缺省的安全选项设置:<br />
1) <strong>Network security: LAN Manager authentication level</strong> : change to "Send LM &amp; NTLM responses" ;<br />
2) <strong>Network security: Minimum session security for NTLM SSP based (including secure RPC) clients</strong> : Disable option "Require 128-bit encryption"。 注意只要选 “for NTLM SSP based <strong>clients</strong>"即可。</p>
<p>现在再次访问你的Samba服务器，看看熟悉的界面是否又回来了 <img src='http://software.intel.com/zh-cn/blogs/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>注：好像第二个安全设置不改动（即保留需要128-bit encryption的选项）在有些环境下也能成功。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/10/29/windows-7samba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>试谈 Cilk™Plus 并行程序性能优化的几个问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/06/25/cilkplus/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/06/25/cilkplus/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 07:31:02 +0000</pubDate>
		<dc:creator>Hao Jiang (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[软件开发工具]]></category>
		<category><![CDATA[Cilk™ Plus]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[Parallel Studio]]></category>
		<category><![CDATA[并行]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/06/25/cilkplus/</guid>
		<description><![CDATA[本文讨论了Cilk™Plus程序中可能出现的几个影响性能的问题，并给出了相应的解决方法。]]></description>
			<content:encoded><![CDATA[<p>性能优化的问题，对于编写Cilk™Plus程序实现并行化也同样重要。</p>
<p>工作密取的调度算法能够帮助Cilk™Plus程序有效地将任务块分配到各个处理器(核)上，从而高效地利用处理器资源。但是如果没有仔细地设计算法，使得整个任务被分成少量的较大任务块，或者大量的小任务块，同样会因为缺乏足够的并行度使得所有处理器保持忙碌状态，或者频繁任务调度带来的大量额外开销，最终导致程序并行的实际效果并不理想。特别是当你使用cilk_spawn时，需要注意避免衍生出大量的小任务块。</p>
<p>通常情况下，Cilk™ Plus程序常见的性能隐患大致会有以下几种：<br />
1) <strong>cilk_for的GrainSize设置</strong><br />
英特尔编译器和运行系统会使用一个公式来计算缺省的粒度值。你也可以通过试验不同的粒度值来进行性能调优。</p>
<p>2) <strong>锁竞争</strong><br />
使用锁通常会降低程序并行度而影响性能。</p>
<p>3) <strong>高速缓存的效率和内存带宽</strong><br />
多个核对总线带宽的竞争限定了内存和处理器之间进行数据传输的速度。因此在设计和实现) Cilk™Plus并行程序时，要考虑到高速缓存效率和数据/空间局部性。</p>
<p>4) <strong>内存分配</strong><br />
使用malloc，free，new，或者delete等在堆上分配或释放内存空间时，运行库会使用互斥锁来保护堆数据结构不被破坏。当Cilk™Plus程序中个strand试图同时分配或释放内存空间时，对于锁的竞争会大幅降低程序的并行度。一个可行的解决方法是使用可缩放的内存管理器，比如Intel® Threading Building Block库（TBB）中提供的内存管理器。</p>
<p>5) <strong>伪共享（False Sharing）</strong><br />
当两个或更多核拥有同一个高速缓存行的拷贝时就会产生伪共享。当某个核执行内存写操作，高速缓存硬件为了保证数据一致性，会将该行重新读入后才能再次访问。如果伪共享频繁发生，Cilk™Plus程序在性能上付出的代价可能会变得非常高昂。</p>
<p>6) <strong>原子操作</strong><br />
编译器提供的原子操作会对高速缓存行进行加锁。因此，这些操作会和锁竞争一样影响性能。此外，由于对高速缓存是整行加锁，这样还可能导致伪共享。</p>
<p>及时发现这些常见的性能问题，我们可以借助性能优化工具来进行分析和定位。</p>
<p>针对Cilk™Plus并行程序的性能分析和优化，英特尔会在Parallel Studio 2011新版本中全面支持。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/06/25/cilkplus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

