<?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; ani01</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/ani01/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>使用.net4.0中的并行计算来处PI值, 及多线程处理比较</title>
		<link>http://software.intel.com/zh-cn/blogs/2009/12/15/net40pi/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2009/12/15/net40pi/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 10:08:59 +0000</pubDate>
		<dc:creator>ani01</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2009/12/15/net40pi/</guid>
		<description><![CDATA[看到另一位老兄介绍的NET4.0并行计算(http://blog.csdn.net/bitfan/archive/2009/09/09/4534359.aspx)，忍不住下载了一个2010BETA来试试。 实验后的结果表明并行计算的最终效果还是比较明显的，更主要是非常简单。 用计算PI的结果来做实验，算法来自：http://en.wikipedia.org/wiki/Pi 贴一下:) 先用传统的算法、多线程、然后用并行算法。比较结果如下(环境：CPU(双核 T5600 1.83G*2) + 2.5G内存 + WinXPsp2)： 让人意外的结果，基本上并行没有带来什么性能提升。 以下的结果是在另一机器上测得(CPU E8400：双核 3.0G*2 + 2G内存 + win2003Server) 上两张图的明显不同是：CPU的的第一次处理曲线。在2003Server的机器上两个核基本上负担相同。 (是不是在2003SERVER下，已经有过处理均衡优化了？!) 先不管并行有没有带来什么提升性能，2010中的并行处理的确太简单了，只要有多线程的编程经验就足够 下面贴代码(有问题请大家指出来) view plaincopy to clipboardprint? class CPICacu { const int iTruncatedNum = 100; const int m_iCacuTimes = 5000000; byte[] m_bytaryResult1 = new byte[iTruncatedNum]; byte[] m_bytaryResult2 = new byte[iTruncatedNum]; bool m_bFinish1 = false; bool [...]]]></description>
			<content:encoded><![CDATA[<p>看到另一位老兄介绍的NET4.0并行计算(http://blog.csdn.net/bitfan/archive/2009/09/09/4534359.aspx)，忍不住下载了一个2010BETA来试试。</p>
<p>实验后的结果表明并行计算的最终效果还是比较明显的，更主要是非常简单。</p>
<p>用计算PI的结果来做实验，算法来自：http://en.wikipedia.org/wiki/Pi</p>
<p>贴一下:)</p>
<p>先用传统的算法、多线程、然后用并行算法。比较结果如下(环境：CPU(双核 T5600 1.83G*2) + 2.5G内存 + WinXPsp2)：</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/Ani/EntryImages/20091020/xp-parrallel.JPG" alt="null" /></p>
<p>让人意外的结果，基本上并行没有带来什么性能提升。</p>
<p>以下的结果是在另一机器上测得(CPU E8400：双核 3.0G*2 + 2G内存 + win2003Server)</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/Ani/EntryImages/20091020/2003Server-parallel.JPG" alt="null" /></p>
<p>上两张图的明显不同是：CPU的的第一次处理曲线。在2003Server的机器上两个核基本上负担相同。</p>
<p>(是不是在2003SERVER下，已经有过处理均衡优化了？!)</p>
<p>先不管并行有没有带来什么提升性能，2010中的并行处理的确太简单了，只要有多线程的编程经验就足够</p>
<p>下面贴代码(有问题请大家指出来)</p>
<p>view plaincopy to clipboardprint?<br />
class CPICacu<br />
{<br />
const int iTruncatedNum = 100;<br />
const int m_iCacuTimes = 5000000;<br />
byte[] m_bytaryResult1 = new byte[iTruncatedNum];<br />
byte[] m_bytaryResult2 = new byte[iTruncatedNum];<br />
bool m_bFinish1 = false;<br />
bool m_bFinish2 = false;<br />
void Cacu1()<br />
{<br />
byte[] bytaryTmp = new byte[iTruncatedNum];<br />
int iTopValue = 4;<br />
int iBaseValue = 1;<br />
for (int i = 0; i &lt; m_iCacuTimes; i += 2)<br />
{<br />
iTopValue = 4;<br />
int j = 0;<br />
//计算一个分式<br />
for (; j = iBaseValue)<br />
{<br />
bytaryTmp[j] += 1;<br />
iTopValue -= iBaseValue;<br />
}<br />
iTopValue *= 10;<br />
}<br />
//把计算出来的值相加<br />
int iNeedIncrease = 0;<br />
for (j = iTruncatedNum - 1; j &gt;= 0; --j)<br />
{<br />
iTopValue = m_bytaryResult1[j] + bytaryTmp[j] + iNeedIncrease;<br />
System.Diagnostics.Debug.Assert(iTopValue 9)<br />
{<br />
m_bytaryResult1[j] = Convert.ToByte(iTopValue % 10);<br />
iNeedIncrease = (iTopValue - m_bytaryResult1[j]) - 9;<br />
}<br />
else<br />
{<br />
m_bytaryResult1[j] = Convert.ToByte(iTopValue);<br />
iNeedIncrease = 0;<br />
}<br />
}<br />
iBaseValue += 2 + 2;<br />
}<br />
m_bFinish1 = true;<br />
}<br />
void Cacu2()<br />
{<br />
byte[] bytaryTmp = new byte[iTruncatedNum];<br />
int iTopValue = 4;<br />
int iBaseValue = 1+2;<br />
for (int i = 0; i &lt; m_iCacuTimes; i += 2)<br />
{<br />
iTopValue = 4;<br />
int j = 0;<br />
//计算一个分式<br />
for (; j = iBaseValue)<br />
{<br />
bytaryTmp[j] += 1;<br />
iTopValue -= iBaseValue;<br />
}<br />
iTopValue *= 10;<br />
}<br />
//把计算出来的值相加<br />
int iNeedIncrease = 0;<br />
for (j = iTruncatedNum - 1; j &gt;= 0; --j)<br />
{<br />
iTopValue = m_bytaryResult2[j] + bytaryTmp[j] + iNeedIncrease;<br />
System.Diagnostics.Debug.Assert(iTopValue 9)<br />
{<br />
m_bytaryResult2[j] = Convert.ToByte(iTopValue % 10);<br />
iNeedIncrease = (iTopValue - m_bytaryResult2[j]) - 9;<br />
}<br />
else<br />
{<br />
m_bytaryResult2[j] = Convert.ToByte(iTopValue);<br />
iNeedIncrease = 0;<br />
}<br />
}<br />
iBaseValue += 2 + 2;<br />
}<br />
m_bFinish2 = true;<br />
}<br />
public void Cacu()<br />
{<br />
System.Action[] aryAction = new Action[]{ this.Cacu1,this.Cacu2};<br />
System.Threading.Parallel.Invoke(aryAction);<br />
//sub the two arrary<br />
Program.SubArray(m_bytaryResult1, m_bytaryResult2);<br />
for (int i = 0; i &lt; iTruncatedNum; ++i)<br />
System.Console.Write(m_bytaryResult1[i]);<br />
}<br />
public void CacuByThread()<br />
{<br />
System.Threading.Thread thd0 = new System.Threading.Thread(new System.Threading.ThreadStart(Cacu1));<br />
System.Threading.Thread thd1 = new System.Threading.Thread(new System.Threading.ThreadStart(Cacu2));<br />
thd0.Start();<br />
thd1.Start();<br />
m_bFinish1 = m_bFinish2 = false;<br />
while (m_bFinish1 != true || m_bFinish2 != true) System.Threading.Thread.Sleep(1);<br />
//sub the two arrary<br />
Program.SubArray(m_bytaryResult1, m_bytaryResult2);<br />
for (int i = 0; i = 0; --j)<br />
{<br />
iTmp = bytaryOne[j] - bytaryTwo[j] + iNeedIncrease;<br />
System.Diagnostics.Debug.Assert(iTmp &gt;= -10);<br />
if (iTmp = 0);<br />
iNeedIncrease = -1;<br />
}<br />
else<br />
{<br />
iNeedIncrease = 0;<br />
}<br />
bytaryOne[j] = Convert.ToByte(iTmp);<br />
}<br />
}<br />
public static void CacuPITrid()<br />
{<br />
int iTruncatedNum = 100;<br />
byte[] bytaryResult = new byte[iTruncatedNum];<br />
byte[] bytaryTmp = new byte[iTruncatedNum];<br />
int iTopValue = 4;<br />
int iBaseValue = 1;<br />
bool bAdd = true;<br />
for (int i = 0; i &lt; 5000000; ++i)<br />
{<br />
iTopValue = 4;<br />
int j = 0;<br />
//计算一个分式<br />
for (; j = iBaseValue)<br />
{<br />
bytaryTmp[j] += 1;<br />
iTopValue -= iBaseValue;<br />
}<br />
iTopValue *= 10;<br />
}<br />
//把计算出来的值相加<br />
int iNeedIncrease = 0;<br />
if (bAdd)<br />
{<br />
for (j = iTruncatedNum - 1; j &gt;= 0; --j)<br />
{<br />
iTopValue = bytaryResult[j] + bytaryTmp[j] + iNeedIncrease;<br />
System.Diagnostics.Debug.Assert(iTopValue 9)<br />
{<br />
bytaryResult[j] = Convert.ToByte(iTopValue % 10);<br />
iNeedIncrease = (iTopValue - bytaryResult[j]) - 9;<br />
}<br />
else<br />
{<br />
bytaryResult[j] = Convert.ToByte(iTopValue);<br />
iNeedIncrease = 0;<br />
}<br />
}<br />
}<br />
else<br />
{<br />
for (j = iTruncatedNum - 1; j &gt;= 0; --j)<br />
{<br />
iTopValue = bytaryResult[j] - bytaryTmp[j] + iNeedIncrease;<br />
System.Diagnostics.Debug.Assert(iTopValue &gt;= -10);<br />
if (iTopValue = 0);<br />
iNeedIncrease = -1;<br />
}<br />
else<br />
{<br />
iNeedIncrease = 0;<br />
}<br />
bytaryResult[j] = Convert.ToByte(iTopValue);<br />
}<br />
}<br />
iBaseValue += 2;<br />
bAdd = !bAdd;<br />
}<br />
for (int i = 0; i &lt; iTruncatedNum; ++i)<br />
System.Console.Write(bytaryResult[i]);<br />
}</p>
<p>static void Main(string[] args)<br />
{<br />
System.Console.WriteLine("Traditional algorithm...\n");<br />
DateTime dteStart = DateTime.Now;<br />
CacuPITrid();<br />
TimeSpan ts = DateTime.Now - dteStart;<br />
System.Console.WriteLine("\nTotal used:" + ts.ToString());<br />
System.Console.WriteLine("\nMulti-Thread algorithm...\n");<br />
dteStart = DateTime.Now;<br />
CPICacu parrallelPICacu = new CPICacu();<br />
parrallelPICacu.CacuByThread();<br />
ts = DateTime.Now - dteStart;<br />
System.Console.WriteLine("\nTotal used:" + ts.ToString());<br />
System.Console.WriteLine("\nParallel algorithm...\n");<br />
dteStart = DateTime.Now;<br />
CPICacu parrallelPICacu1 = new CPICacu();<br />
parrallelPICacu1.Cacu();<br />
ts = DateTime.Now - dteStart;<br />
System.Console.WriteLine("\nTotal used:" + ts.ToString());<br />
System.Console.Read();<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2009/12/15/net40pi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

