<?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; Xiaoping Duan (Intel)</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/xiaoping-duan/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>试用 Intel® Array Building Blocks (Intel® ArBB)中的例子程序</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/11/04/intel-array-building-blocks-intel-arbb/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/11/04/intel-array-building-blocks-intel-arbb/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 08:26:06 +0000</pubDate>
		<dc:creator>Xiaoping Duan (Intel)</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/11/04/intel-array-building-blocks-intel-arbb/</guid>
		<description><![CDATA[Intel ArBB是Intel最新推出的并行编程技术，它可以帮助程序开发者摆脱对底层并行机制和硬件架构的依赖，能够支持当前最新以及未来的硬件架构所提供的向量化，并行化功能。在Intel ArBB的安装包中自带了一些例子程序，用于展示如何使用ArBB进行编程以及ArBB在性能提升方面的效果。]]></description>
			<content:encoded><![CDATA[<p>Intel ArBB是Intel最新推出的并行编程技术，它可以帮助程序开发者摆脱对底层并行机制和硬件架构的依赖，能够支持当前最新以及未来的硬件架构所提供的向量化，并行化功能。使用ArBB的程序不仅可以在现有的平台上能够充分利用CPU的向量化指令和多核并行特性，而且在将来使用新架构的CPU上可无需作任何改动就能自动利用新架构带来的好处。</p>
<p>在Intel ArBB的安装包中自带了一些例子程序，用于展示如何使用ArBB进行编程以及ArBB在性能提升方面的效果。下面让我们一起来动手试着编译，运行这些例子程序。</p>
<p>通常情况下，Intel ArBB的例子程序被安装在“C:\Program Files\Intel\arbb\Beta1\samples”目录下面（注：64位系统上是”Program Files(x86)”）。所有的例子程序都被集中到一个微软Visual Studio的solution文件中。solution文件名中不同的数字对应于不同版本的Visual Studio。打开相应版本的solution文件后可以看到其中包含了十来个project，而这些project又根据应用类型分成了几个文件夹。</p>
<p>在编译整个solution之前先要做一些配置，主要是把Intel ArBB的头文件和库文件目录添加到相应的搜索路径中去，否则在编译的过程中会报出无法找到头文件或库文件的错误。添加是通过菜单选项”Tools -&gt; Options”弹出的Visual Studio配置对话框来完成的。</p>
<p>添加头文件目录：</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/include_path.bmp"><img class="alignnone size-full wp-image-400006308" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/include_path.bmp" alt="" /></a></p>
<p>添加库文件目录：</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/lib_path.bmp"><img class="alignnone size-full wp-image-400006309" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/lib_path.bmp" alt="" /></a></p>
<p>如果编译的目标程序是64位系统，记得添加目录时选择的平台应为x64而不是Win32。</p>
<p>添加好目录后就可以按“F7”开始编译了。如果一切正常的话，编译过程会顺利结束。</p>
<p>接下来就可以运行这些例子程序了。运行这些程序有两种方式：</p>
<p>1. 直接在Visual Studio中通过”F5”或”Ctrl+F5”来启动程序运行。</p>
<p>2. 在命令行窗口中以命令行方式启动程序运行。</p>
<p>使用Intel ArBB的程序在运行时需要调用相关的运行库，所以系统路径环境变量要包含Intel ArBB库所在的目录，否则就会出现找不到dll的运行错误。通常Intel ArBB的安装程序会自动向系统配置中添加路径，但是在64位系统上安装程序只会添加64位Intel ArBB目录到系统中。所以，如果你是在64位系统上编译32位代码然后直接运行的话就会出现dll无法找到的错误。这时你就需要手工将32位Intel ArBB的目录“C:\Program Files (x86)\Intel\arbb\Beta1\bin\ia32”添加到系统PATH变量中去。</p>
<p>向系统PATH中添加路径：</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/path.bmp"><img class="alignnone size-full wp-image-400006310" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/11/path.bmp" alt="" /></a></p>
<p>如果你不想改动整个系统的配置，那么你还可以通过系统开始菜单上的Intel ArBB IA-32模式命令行快捷方式打开一个命令行窗口，然后在该窗口中执行32位程序。</p>
<p>接下来看看Intel ArBB运行结果怎么样：</p>
<p>在Intel® Core™  2 Duo  L9400@1.86G 笔记本上</p>
<p><strong>poisson-solver</strong></p>
<p>Num of Runs: 1</p>
<p>Num of Points: 12288</p>
<p>Errors: 0/12288</p>
<p>Errors: 0/12288</p>
<p>----------------------------------------</p>
<p>Version      Time(s)  Speed Up</p>
<p>C    13.324658  1.000</p>
<p>ArBB1     3.218527  4.140</p>
<p>ArBB2     3.147017  4.234</p>
<p>----------------------------------------</p>
<p>Test finished</p>
<p>输出结果中的C版本是用普通C语言实现的算法，耗时大约13秒，这里把它作为基准。ArBB1和ArBB2是用Intel ArBB以两种不同方式实现的同样算法，耗时都在3秒多一点。我们可以看出两个ArBB版本的代码都可以提高性能4倍以上。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/11/04/intel-array-building-blocks-intel-arbb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cilk 程序中 strand 到工作线程的映射</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/06/25/cilk-strand/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/06/25/cilk-strand/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 03:55:14 +0000</pubDate>
		<dc:creator>Xiaoping Duan (Intel)</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[并行计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/06/25/cilk-strand/</guid>
		<description><![CDATA[和其它并行编程方法一样，在程序运行过程中Cilk的运行时系统会将用户程序中的strand映射到操作系统线程上。但是，为了保证程序的串行语义Cilk的运行时系统会采取一些与众不同的策略。我们以下面的图为例来看一看到底有不同之处。 图中圆圈表示并行控制结构，也就是程序中的cilk_spawn或cilk_sync；标有数字的线条表示strand，对应的是程序中不包含任何并行控制结构的串行部分。这里假定strand（3）是通过位于A节点的cilk_spawn衍生出来的子任务，节点B表示cilk_sync。 执行这个Cilk程序的操作系统线程我们称之为工作线程。当有多个工作线程可用时，这个程序有两种可能的执行方式：  整个程序由单一工作线程执行，或  调度程序选择在不同的工作线程上执行strand（2）和（3）。 为了保证串行语义，衍生出来的函数总是和进入衍生节点的那个strand在同一个工作线程上执行。于是，在这个例子中，strand（1）和strand（3）总是在同一个工作线程上执行。 这和大多数人的直觉正好相反，因为通常我们都会认为衍生出来的子任务会被新的线程执行，原有的线程会执行strand（2）。 如果此时有其它工作线程可用，那么strand（2）（延续部分）可以在另外的工作线程上执行。接下来，在节点B的cilk_sync之后，程序执行可以由进入同步接点的任一工作线程继续。 这也和我们的直觉有所不同，因为通常我们都会认到这里新的线程会中止，后面的程序的会由最开始的线程（即执行strand（1）的线程）执行。 结论：从这个例子我们可以看到为了保证程序原有的串行语义，Cilk的运行时系统采取了一种和大多数人直觉不同的策略把strand映射到多个工作线程之上。所以我们在编程时要避免使用依赖于当前线程的数据访问手段，例如使用线程本地存储。这是因为在cilk_sync之后程序可选择由任一工作线程继续执行，而这个选择是不确定的。]]></description>
			<content:encoded><![CDATA[<p>和其它并行编程方法一样，在程序运行过程中Cilk的运行时系统会将用户程序中的strand映射到操作系统线程上。但是，为了保证程序的串行语义Cilk的运行时系统会采取一些与众不同的策略。我们以下面的图为例来看一看到底有不同之处。</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/06/cilk_strand1.jpg"><img class="alignnone size-medium wp-image-400004314" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2010/06/cilk_strand1-300x105.jpg" alt="" width="300" height="105" /></a></p>
<p>图中圆圈表示并行控制结构，也就是程序中的cilk_spawn或cilk_sync；标有数字的线条表示strand，对应的是程序中不包含任何并行控制结构的串行部分。这里假定strand（3）是通过位于A节点的cilk_spawn衍生出来的子任务，节点B表示cilk_sync。</p>
<p>执行这个Cilk程序的操作系统线程我们称之为工作线程。当有多个工作线程可用时，这个程序有两种可能的执行方式：<br />
 整个程序由单一工作线程执行，或<br />
 调度程序选择在不同的工作线程上执行strand（2）和（3）。</p>
<p><strong>为了保证串行语义，衍生出来的函数总是和进入衍生节点的那个strand在同一个工作线程上执行。</strong>于是，在这个例子中，strand（1）和strand（3）总是在同一个工作线程上执行。 这和大多数人的直觉正好相反，因为通常我们都会认为衍生出来的子任务会被新的线程执行，原有的线程会执行strand（2）。</p>
<p>如果此时有其它工作线程可用，那么strand（2）（延续部分）可以在另外的工作线程上执行。接下来，<strong>在节点B的cilk_sync之后，程序执行可以由进入同步接点的任一工作线程继续</strong>。 这也和我们的直觉有所不同，因为通常我们都会认到这里新的线程会中止，后面的程序的会由最开始的线程（即执行strand（1）的线程）执行。</p>
<p><strong>结论</strong>：从这个例子我们可以看到为了保证程序原有的串行语义，Cilk的运行时系统采取了一种和大多数人直觉不同的策略把strand映射到多个工作线程之上。所以我们在编程时要避免使用依赖于当前线程的数据访问手段，例如使用线程本地存储。这是因为在cilk_sync之后程序可选择由任一工作线程继续执行，而这个选择是不确定的。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/06/25/cilk-strand/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

