﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Der See der Vergessens-随笔分类-无庸技术</title><link>http://www.cppblog.com/Jedimaster/category/2348.html</link><description>    忘却之湖</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 10:42:15 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 10:42:15 GMT</pubDate><ttl>60</ttl><item><title>终于挪到了博客园，这个博客不再更新</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/28/19074.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Wed, 28 Feb 2007 15:05:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/28/19074.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/19074.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/28/19074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/19074.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/19074.html</trackback:ping><description><![CDATA[
		<p>重要文章移动到了博客园，地址是 <a href="http://jedimaster.cnblogs.com/">http://jedimaster.cnblogs.com/</a>，以后这个站点不再更新<br /><br />有空常来哦~~~~</p>
<img src ="http://www.cppblog.com/Jedimaster/aggbug/19074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-28 23:05 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/28/19074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pure GPU Computing Platform : NVIDIA CUDA Tutorial</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/24/18939.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sat, 24 Feb 2007 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/24/18939.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18939.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/24/18939.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18939.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18939.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 近距离接触NVIDIA新发布的GPU计算平台CUDA&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/24/18939.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-24 14:42 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/24/18939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python与Microsoft Office自动化操作</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/21/18895.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Wed, 21 Feb 2007 04:37:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/21/18895.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18895.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/21/18895.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18895.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用Python语言及其库对Excel进行操作实现自动化&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/21/18895.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-21 12:37 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/21/18895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl穷举破解表单密码的实现</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/16/18831.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Fri, 16 Feb 2007 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/16/18831.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18831.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/16/18831.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18831.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18831.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Perl穷举破解表单密码的实现&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/16/18831.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-16 21:55 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/16/18831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用SAH实现kD树快速分割模型实践</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/15/18812.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 15 Feb 2007 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/15/18812.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18812.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/15/18812.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18812.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18812.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: kD				树是二叉树结构的一个变种，当前主要用于加速光纤跟踪的遍历过程。最简单的排序二叉树以各个元素的大小关系作为分割点，而				kD				树简而言之就是从数据中选择一个“维度”构造一个超平面对数据集进行分割。比如要对学生数据进行分割，找出哪些学生的生日小于				2				月				18				日，那么就只要遍历整个集合，把所有的数据分成。如果又要在符合第一次条...&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/15/18812.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-15 22:31 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/15/18812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>木材工业机械寻址</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/11/18664.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sun, 11 Feb 2007 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/11/18664.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18664.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/11/18664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18664.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 木工板材生产工艺的相关内容&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/11/18664.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-11 19:06 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/11/18664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏音乐浅谈</title><link>http://www.cppblog.com/Jedimaster/archive/2007/02/10/18621.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sat, 10 Feb 2007 11:49:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2007/02/10/18621.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/18621.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2007/02/10/18621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/18621.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/18621.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 游戏音乐浅谈&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2007/02/10/18621.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/18621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2007-02-10 19:49 <a href="http://www.cppblog.com/Jedimaster/archive/2007/02/10/18621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>矩阵圣经 FOR 3D Computer Graphic Final</title><link>http://www.cppblog.com/Jedimaster/archive/2006/12/10/16216.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sun, 10 Dec 2006 05:46:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/12/10/16216.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/16216.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/12/10/16216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/16216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/16216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 想来编程也有一段时间，什么都很明白就是对于坐标变换不是很理解，总是在关键的时候迷乱不已，胡乱的写一些变换代码，得到的结果当然让自己云里雾里。仔细的看了一下好几本书关于3D变换的篇章，总结了一下，希望对大家有帮助。末了声明以下，可能我说得也有错误的地方，敬请局内人明鉴指正，我只是一个在校学生没有实际的工作经验。恳请大家提出宝贵的意见，打造一个Matrix Bible，让更多的初学者不要走弯路。谢谢大...&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2006/12/10/16216.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/16216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-12-10 13:46 <a href="http://www.cppblog.com/Jedimaster/archive/2006/12/10/16216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用姓名汉语拼音首字母查找</title><link>http://www.cppblog.com/Jedimaster/archive/2006/11/23/15605.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 23 Nov 2006 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/11/23/15605.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/15605.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/11/23/15605.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/15605.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/15605.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> Pyin.cpp : 定义控制台应用程序的入口点。<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//<br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">stdafx.h</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> GetPYChar(</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> c)<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_100_987_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_987_Open_Text.style.display='none'; Codehighlighter1_100_987_Closed_Image.style.display='inline'; Codehighlighter1_100_987_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_100_987_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_987_Closed_Text.style.display='none'; Codehighlighter1_100_987_Open_Image.style.display='inline'; Codehighlighter1_100_987_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_100_987_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_100_987_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    unsigned </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> array </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> unsigned </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000">[</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">];<br /></span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    array[</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">]</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">c[</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">];<br /></span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    array[</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">]</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">c[</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">];<br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">short</span>
						<span style="COLOR: #000000">)(array[</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">] </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">\0</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">256</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> ((</span>
						<span style="COLOR: #0000ff">short</span>
						<span style="COLOR: #000000">)(array[</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">] </span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">\0</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">));<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB0A1</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB0C5</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">a</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB2C1</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">b</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB4EE</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">c</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB6EA</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">d</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">19</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB7A2</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">e</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB8C1</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">f</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">21</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xB9FE</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">g</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">22</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xBBF7</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">h</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">23</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xBFA6</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">g</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC0AC</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">k</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC2E8</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">l</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC4C3</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">m</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC5B6</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">n</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">28</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC5BE</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">o</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">29</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC6DA</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">p</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">30</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC8BB</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">q</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">31</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xC8F6</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">r</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">32</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xCBFA</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">s</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">33</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xCDDA</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">t</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">34</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xCEF4</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">w</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">35</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xD1B9</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">x</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">36</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xD4D1</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">y</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">37</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ( i </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0xD7FA</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">z</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">38</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">39</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">40</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">41</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> _tmain(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc, _TCHAR</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> argv[])<br /></span>
				<span style="COLOR: #008080">42</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_1027_1260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1027_1260_Open_Text.style.display='none'; Codehighlighter1_1027_1260_Closed_Image.style.display='inline'; Codehighlighter1_1027_1260_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_1027_1260_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1027_1260_Closed_Text.style.display='none'; Codehighlighter1_1027_1260_Open_Image.style.display='inline'; Codehighlighter1_1027_1260_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_1027_1260_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1027_1260_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">43</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> szArray </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000">[</span>
						<span style="COLOR: #000000">10</span>
						<span style="COLOR: #000000">];<br /></span>
						<span style="COLOR: #008080">44</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    strcpy(szArray,</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">朱王</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080">45</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> charptr </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> szArray;<br /></span>
						<span style="COLOR: #008080">46</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    cout</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">szArray</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">endl;<br /></span>
						<span style="COLOR: #008080">47</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">48</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    cout</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #0000ff">sizeof</span>
						<span style="COLOR: #000000"> szArray</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">endl;<br /></span>
						<span style="COLOR: #008080">49</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    cout</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">GetPYChar(charptr)</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">endl;<br /></span>
						<span style="COLOR: #008080">50</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    cout</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">GetPYChar(charptr</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">)</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">endl;<br /></span>
						<span style="COLOR: #008080">51</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    system(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">PAUSE</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080">52</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">53</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">54</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">55</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">56</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />　　老同学做小小的编程设计，电话号码本，希望增加一个输入姓名汉语拼音首字母的方式快速找到条目，不知道如何实现。我就找了一下，觉得按照这种思路最简单。<br />　　<br />　　首先在条目的数据结构中增加一个动态字符串，在生成节点的时候动态的把姓名的拼音准备好。等到用这个方法搜索条目的时候只需要对比拼音索引，返回符合条件的节点指针就可以了。<img src ="http://www.cppblog.com/Jedimaster/aggbug/15605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-11-23 23:53 <a href="http://www.cppblog.com/Jedimaster/archive/2006/11/23/15605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BattleField 2142引擎图形程序员小访谈</title><link>http://www.cppblog.com/Jedimaster/archive/2006/11/10/14953.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Fri, 10 Nov 2006 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/11/10/14953.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/14953.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/11/10/14953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/14953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/14953.html</trackback:ping><description><![CDATA[
		<p>　　最近在vLan上面鏖战BF2142，着实被这个游戏深深地吸引住，所以就开始关注起BF系列的引擎起来，只知道Script部分是Python完成的。在国外的一个站点上发现了这个小小的访谈，翻译给大家仅供了解。</p>
		<p>Continuing our series of occasional interviews with game developers about current and upcoming hardware and game graphics engines, we chat with Marko Kylmamaa, senior graphics programmer for Digital Illusion' Canadian studio.</p>
		<p>　　本期的采访对象是来自DICE的高级图像程序员Marko Kylmamaa先生。</p>
		<p>    FiringSquad: First, Intel and AMD are pushing dual core processors and within the next year four core processors are due to be released. How will DICE support this kind of tech in the Battlefield 2/2142 engine and will there be any need for special programming to fully support multi core CPUs in PCs?</p>
		<p>　　提问：目前Intel与AMD力推双核CPU，目前明年都准备推出４核心的CPU。DICE准备如何在BF2引擎中加入对这种技术的支持，如果这样做需要什么特殊的编程技术么？</p>
		<p>    Marko Kylmamaa: While a program geared towards a single-core machine may run fine, with some exceptions, and perhaps even somewhat faster on a multi-core machine, in order to realize the real performance benefits a careful attention has to be paid into structuring the code for the correct granularity in mind, to make it suitable for multi-core execution. With the introduction of the next generation consoles and the PC hardware, the whole industry is in a learning phase for understanding the differences between the traditional multi-threading approaches, and multi-threading for multiple cores. DICE is working closely with hardware vendors in making sure that all of the future titles make the maximum use of the available multi-core architecture.</p>
		<p>　　回答：本来单核心的机器就可以运行得很好，有些时候甚至要快于多核机器。其实问题主要是在多核心的处理比单核心复杂（类似于痛苦的多线程），需要正确的处理代码的结构与处理同步。随着下一代硬件的普及，整个领域开始学习多线程编程技术。DICE也在不断和硬件厂商深入合作发挥多核架构的性能。</p>
		<p>    FiringSquad: The 64-bit CPU has taken longer to really appear in mainstream PCs than some people expected. Do you think 64-bit CPUs will become more popular and how does DICE support it in their Battlefield 2/2142 engine ?</p>
		<p>　　提问：64位CPU的普及速度超过人们的预计到来得如此之快，您认为６４位cpu会流行起来么？DICE在BF2引擎中如何支持它呢？</p>
		<p>    Marko Kylmamaa: One of the problems with harnessing the full power of 64-bit CPU抯 is the lack of adoption of 64-bit operating systems. Due to this it抯 difficult for the game developers to make full use of the 64-bit execution potential without providing a separate set of executables compiled for the different operating systems. The current Battlefield 2 technology has been thoroughly tested on the 64-bit architecture for guaranteeing a solid performance, and optimizations have been made where possible with such architectures in mind.</p>
		<p>　　回答：由于现在64bit操作系统对64位ＣＰＵ的支持不是非常好，所以还无法完全发挥６４位ＣＰＵ的性能。如果不分别的为不同平台编写程序就无法发挥６４位的性能，这是个难点。BF2已经在６４位平台上经过测试与优化过。</p>
		<p>    FiringSquad: Game physics are getting more and more attention as well with more attention being put into destructible objects and better collisions. Where does DICE stand on this kind of support for its engine and what solution is best; having a dedicated card (AGEIA) using a graphics card (ATI/Havok) or using a CPU to handle it?</p>
		<p>　　提问：游戏的物理特性越来越受到重视。DICE如何看待它？您认为哪种方案最好呢？是独立的AGEIA物理卡，还是NV/Havok的图形卡，还是用CPU处理？</p>
		<p>    Marko Kylmamaa: Especially with multiplayer games in mind, it is difficult to make use of scaleable physics, since especially from the gameplay perspective all of the players must experience the same end result in simulation regardless of their hardware. This leads to a lot of the scalability of the physics being used for visual effects such as richer particle effects or fluid simulation. The GPU can of course be used for offloading the physics simulation from the CPU, but this will compete with the remaining processing time for graphics. Therefore in most cases it is necessary to strike the right balance between the CPU and GPU usage with the needs of the particular game in mind. The next generation technology at DICE is being built on the bleeding edge and will make use of very comprehensive physical modeling.</p>
		<p>　　回答：在多人游戏中使用物理特性是相当难做的，从玩家的视角来说，所有的交互角色必须体验到相同的物理特性而不关系他们说使用的是何种硬件。已经使用的物理特性有比如流体模拟粒子系统等等。ＧＰＵ可以分担一些ＣＰＵ的物理模拟计算工作，但是这样就和图形计算争抢了宝贵的资源。虽然如此，我们依旧需要平衡ＣＰＵ和ＧＰＵ之间的负载。DICE将会充分的利用下一代技术为玩家构建最优秀的物理体验。</p>
		<p>    FiringSquad: HDR lighting is also getting a lot of attention in more PC games. How does the Battlefield 2/2142 engine support those features and how will that help the graphics in games that use it?</p>
		<p>　　提问：HDR光照效果也被越来越多的提及。BF2/2142引擎是如何支持这种特效，而且它将如何提升游戏画面呢？</p>
		<p>    Marko Kylmamaa: HDR lighting can add significantly to the perceived realism in the modern graphics engines. It is becoming an increasingly common feature as the new hardware supports full floating point surfaces and has the required processing power for supporting a multitude of such high end features.<br />    Some aspects of the HDR lighting were simulated especially in the Battlefield 2   Expansion Pack: Special Forces, for adding a degree of realism to the night-time look. The effect is fairly settle and was used mainly for fine tuning the overall look. Battlefield 2142 does not have night-time levels, so the same technology was not applicable to it, however there are a great number of special lighting effects for enhancing the desired futuristic look of the game.</p>
		<p>　　回答：HDR光照可以作为现代图形引擎的一个特性。在新硬件完全支持浮点计算的方式下，它可以提高画面质量让它看起来更真实，同时也需要相当的计算量。ｈｄｒ在ｂｆ２特别武力　中被使用，用于夜视效果。BF2142没有夜市场景，所以也就没有使用这种技术（应该是HDR），不过我们使用其他的光照效果提高画面的真实感。</p>
		<p>    FiringSquad: More and more games are using extensive pixel and vertex shading for visual and art effects. How does the Battlefield 2/2142 engine support these features currently and how will pixel and vertex shaders be used in the future, particularly with Windows Vista and DirectX10 support?</p>
		<p>　　提问：越来越过的游戏广泛使用PS及VS技术提高画面质量。BF2/2142的引擎如何支持这些特色，未来PS VS将被如何使用，特别是VISTA和DX10的来临？</p>
		<p>    Marko Kylmamaa: The Battlefield 2 engine has been built on the DirectX9 architecture and is a fully shader based model. This allowed for a great flexibility during the development, and not supporting the older fixed function pipeline model allowed us to concentrate solely on the high end features. Battlefield 2142 is based on the improved Battlefield 2 technology and will be released later this year, so considering that the DirectX10 hardware won抰 be widely available just yet, it hasn抰 been beneficial to re-architect the engine into a DirectX10 based model for this release. This allowed the available time to be used for adding a number of new special effects and polishing the overall look of the existing engine.</p>
		<p>　　回答：目前BF2引擎完全构建于DX9架构，这是个完全基于Shader的模型。这提高了开发的可伸缩性，摆脱了FF管线模型让我们得以实现最高级的特效。BF2142基于改进的BF2引擎技术，不久将发布于世，所以考虑到DX10硬件不会那么快的普及，我们将引擎重新构建以适应DX10的模型。这样我们就有时间在以后的日子里继续加入新的效果，拓展现有的引擎。</p>
		<p>    FiringSquad: What other advanced hardware and graphical features do you think will be supported in upcoming Battlefield 2/2142 engine games and in future graphics engine?</p>
		<p>　　提问：您认为BF2/2142引擎将会支持哪些高级的硬件及其图形技术，未来的引擎呢？</p>
		<p>    Marko Kylmamaa: Battlefield 2142 will support a large range of high end special effects geared towards creating the desired futuristic look. These involve for example new atmospheric effects for creating a unique look that is quite different from Battlefield 2.</p>
		<p>　　回答：BF2142支持许多特效用来构建绚丽真实的图像。比如，球体光照技术（Atomospheric Effect）技术就和BF2中的不同。</p>
		<p>    FiringSquad: Finally, Mark Rein from Epic has said that Intel is hurting the PC gaming industry through its use of intergrated graphics in PCs. Is this a real threat and if so what can be done about this from the game developer's side?</p>
		<p>　　提问：最后，Epic（不要告诉我不知道，即将发布的UT2007）的Mark Rein说，Intel正在通过集成图形硬件损害PC游戏工业。从游戏开发者的角度来说您如何看待这个问题？</p>
		<p>    Marko Kylmamaa: Intel produces what you could call the ultra-low end graphics cards for a market segment that typically doesn抰 wish to invest the money into a higher end, gaming geared hardware. Clearly there is a demand for this type of hardware as Intel抯 graphics cards boast a large user base. However, this does impose challenges for the games industry in our attempts at reaching especially for the casual gamer market. Hardware requirements for the next generation games keep growing faster than what is needed for running general applications, which increases the rift between the casual and hardcore hardware markets. I believe that we as an industry will also have to recognize the different requirements these markets impose.<br />    From the perspective of a developer, it can be difficult or in some cases practically impossible to make the high-end game run on the ultra-low end hardware. Supporting such scalability range in performance could be prohibitive with the required development time and cost in mind. It is ultimately up to each developer to find the correct range of hardware which allows for the desired market penetration.</p>
		<p>　　回答：买Intel的显卡的人，就是那些你称之为买低端货的那些人，他们其实都不会花钱构建一个游戏平台。虽然事实如此，由于这个原因的影响，我们还是不太容易开拓这样的一个市场。游戏对硬件的需求总是要远高于商用软件，其实这也扩大了硬件市场的层次差距。我相信整个工业会对看清楚这个问题。从一个游戏开发者的角度来说，让高端游戏运行在低端平台上着实困难。因为要支持这些性能不一的硬件需要提高开发的时间和花费。更本上还是要开发者根据他们所要开发的市场这一角度进行硬件的平台的选择。</p>
<img src ="http://www.cppblog.com/Jedimaster/aggbug/14953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-11-10 11:44 <a href="http://www.cppblog.com/Jedimaster/archive/2006/11/10/14953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPU还可以做什么 —— Brook for GPUs,Stream Computing On GPUs</title><link>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13689.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sat, 14 Oct 2006 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13689.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/13689.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13689.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/13689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/13689.html</trackback:ping><description><![CDATA[    研究GPGPU也有一段时间了，去年这个时候正在学习GLSL。一段时间前在opengl.org上面发了一个Suggestion，建议GLSL向Cg以及CgFX学学架构，不要这样成对成对的零散使用，虽然说自己可以写class进行封装，可是如果Shader一多管理起来是相当的头疼，应该学学HLSL Cg那样的方式，通过technique与pass的选择进行渲染，在概念上也符合multi-pass。<br /><br /><div align="center">    GPU的SIMD性能超强，比CPU强得太多太多，由此带来异常强悍的浮点运算性能，请看下图。<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/jedimaster/gpgpu.JPG" alt="gpgpu.JPG" border="2" height="319" width="545" /><br /><div align="justify"><br />    画外音：不知道我的6200A排在什么地方哈哈。<br /><br />    其实上图有偏颇，这张图节选自Siggraph2004，而现在ATi 1800XT的SIMD性能已经超过了6800好多，可不是游戏性能。不过可以看出，比CPU的浮点运算性能高好几倍是不真的事实，可是如何利用呢？<br /><br />    可编程硬件的到来为我们开了一个好头，也许未来计算机硬件的发展趋势就是，通用计算Generic Computing（GC，自造词汇，可不是垃圾收集）。显卡一直以来都是和Pixel打交道，读取Texel，处理Primitive，写入FrameBuffer，为SIMD的应用打下了坚实的基础。显卡芯片从开始就是并行设计的，这样从纹理单元读取Texel时才能发挥效力，当年大名鼎鼎的Riva TNT2的意思其实是TwiNs Textures双纹理，而不是黄色炸药。Geforce3依靠添加的几个昂贵的register实现了Vertex Programming。NV收购3dfx，推出NV30系列芯片，伴随着DX8为PC机引入Shader，开创PC机图像画质飞跃的先河，如今热门游戏大多数已经使用可编程着色技术用来实现以往在工作站上才能实现的效果，这就是为什么如今看游戏实时演算的画面都比当年Square动用sgi工作站集群渲染出来的FF8动画效果好的原因。其实高级CG图形理论在80年代就已经相当成熟，比如78年的Shadow mapping，White的Ray-tracing等等。那些技术以后我会慢慢给大家介绍，大家不妨去NVIDIA下载一个SDK研究一下，还有MS DX SDK也是必需的。<br /><br />    先说目前可编程硬件用作通用计算的局限，而且在我看来，这个局限在Vista与DX10流行后可能依旧得不到解决，那就是API的问题。显卡厂商提供的驱动，无一例外的都是彻底为显示服务的，而不是用来标榜自己是GPGPU的。虽然说都有了自己的本地编译器（主要是用于编译GLSL string codes，HLSL可以预先编译好，然后再由驱动载入执行），可是依旧不是为了计算非图形数据服务。于是找到了Sh。Sh是一个很有趣的东西，使用了metaprogramming技术，模拟图形语言的算法，编译的时候转化为对应的低等级ASM语句，很多Graphic Slide里面进行核心算法展示的时候都用的Sh。有兴趣地可以到<a href="http://sourceforge.net/projects/libsh">这里</a>看一下。强烈建议显卡厂商推出可以直接进行计算的驱动，不要和FrameBuffer牵涉，可以直接通过Bus写入内存，技术上并不难，也许是个商业问题。关键时刻永远是商业左右技术的发展，而不是技术人员的一厢情愿就可以左右世界发展，如今已经不是工业革命时代了。<br /><br />    给大家介绍来自Starford University的<a href="http://sourceforge.net/projects/brook">Brook</a>（听起来好像广告，不过在Shading Language界可是有Starford Shading Language得一席之地的）。Brook可以理解为是一个C编译器，只不过它编译的不是Bin，而是C++ string codes，而且是着色计算语句数组。比如有这样一段Brook代码，简单的Alpha混合，不对，不像，反正就是它了：<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">kernel </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> saxpy(</span><span style="color: rgb(0, 0, 255);">float</span><span style="color: rgb(0, 0, 0);"> alpha, float4 x</span><span style="color: rgb(0, 0, 0);">&lt;&gt;</span><span style="color: rgb(0, 0, 0);">, float4 y</span><span style="color: rgb(0, 0, 0);">&lt;&gt;</span><span style="color: rgb(0, 0, 0);">,<br /></span><span style="color: rgb(0, 0, 255);">out</span><span style="color: rgb(0, 0, 0);"> float4 result</span><span style="color: rgb(0, 0, 0);">&lt;&gt;</span><span style="color: rgb(0, 0, 0);">) {<br />result </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (alpha </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> x) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> y;<br />}</span></div>    <br />    编译成最终的C++代码变成，<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> __saxpy_fp30[] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {<br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">!!FP1.0\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">DECLARE alpha;\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">TEX R0, f[TEX0].xyxx, TEX0, RECT;\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">TEX R1, f[TEX1].xyxx, TEX1, RECT;\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">MADR o[COLR], alpha.x, R0, R1;\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">END \n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##!!BRCC\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##narg:4\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##c:1:alpha\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##s:4:x\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##s:4:y\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##o:4:result\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##workspace:1024\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">##!!multipleOutputInfo:0:1:\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">,NULL};<br /></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> saxpy (</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">float</span><span style="color: rgb(0, 0, 0);"> alpha,</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> ::brook::stream</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);"> x,</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> ::brook::stream</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);"> y,<br />::brook::stream</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);"> result) {<br /></span><span style="color: rgb(0, 0, 255);">    static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">__saxpy_fp[] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fp30</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, __saxpy_fp30, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ps20</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, __saxpy_ps20,<br /></span><span style="color: rgb(0, 0, 0);">                    "</span><span style="color: rgb(0, 0, 0);">cpu</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, (</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">) __saxpy_cpu, NULL, NULL };<br /></span><span style="color: rgb(0, 0, 255);">    static</span><span style="color: rgb(0, 0, 0);"> __BRTKernel k(__saxpy_fp);<br />    k</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">PushConstant(alpha);<br />    k</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">PushStream(x);<br />    k</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">PushStream(y);<br />    k</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">PushOutput(result);<br />    k</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">Map();<br />}</span></div>    <br />    这不就是纯粹的Shading Language么。不过值得注意的是，Brook通过运行库进行封装，把GPU当作Streaming Processor，由CPU进行控制，计算数据并输出。目前似乎只能进行图形的计算，比如FFT，Ray-Tracing等演示，还没有到达能够计算pi的程度。<br /><br />    思考了一下。精度问题需要解决，FP16刚刚开始广泛使用，FP32还不能够支持硬件过滤。FP32仅仅只是IEEE754 float的精度而已，更本谈不上double的精度，用在需要精度较高的地方可能还不是很适合。如我设想那样，进行pi的几百万位的计算，目前来说不太可能，首先，Shading Language从来就没有提供地址的操作，也就是无法选泽Pixel的位置，也就是无法对FrameBuffer进行准确定位。如果可以解决这个问题，那么就可以进行真正意义上的通用计算，那个时候FrameBuffer只是一个暂时的缓冲容器而已。<br /><br />    SIMD的物理计算可以相当的强悍。物理特性计算都是强调同时性的，而GPU可以同时并行计算，充分发挥了自己的优势，难怪NVIDIA要和Havok进行合作。记得以前看过博客园中一位先生写的物理引擎，着实震惊，我建议他不妨研究研究这一块。Stream的概念将在DX10上得到彻底的诠释，不妨看看我以前翻译的DX10文章，其中Geometry Shader很有意思。<br /><br />    我期待下一代API出现，一个崭新的软硬件组合方案，这样就可能为Display Adapter这个古老的东西带来真正的革命。值得注意的是，AMD已经收购了ATi，而Intel还在为100亿美元收购NV的价格评估的时候，也许下一代变革已经开始了，让我们拭目以待。<br /><br />    提到的东西可以在这里找到<br />    Brook <a href="http://sourceforge.net/projects/brook">http://sourceforge.net/projects/brook</a><br />    libSh <a href="http://sourceforge.net/projects/libsh">http://sourceforge.net/projects/libsh</a><br /></div></div><img src ="http://www.cppblog.com/Jedimaster/aggbug/13689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-10-14 22:21 <a href="http://www.cppblog.com/Jedimaster/archive/2006/10/14/13689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wow服务器解析（一）</title><link>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Sat, 14 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/13674.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/13674.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/13674.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="TEXT-ALIGN: center" align="center">
				<span lang="EN-US">Wow</span>
				<span style="FONT-FAMILY: 宋体">服务器解析（一）</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span>       </span>
				</span>
				<span style="FONT-FAMILY: 宋体">最近抽空研究了一下</span>
				<span lang="EN-US">WOW</span>
				<span style="FONT-FAMILY: 宋体">的服务器结构，也顺便从那些项目中又复习了一下</span>
				<span lang="EN-US">ManGOs</span>
				<span style="FONT-FAMILY: 宋体">中</span>
				<span lang="EN-US">template</span>
				<span style="FONT-FAMILY: 宋体">方式下</span>
				<span lang="EN-US">SingleTon</span>
				<span style="FONT-FAMILY: 宋体">的使用方法。不过有些不明白的，如果这样，</span>
				<span lang="EN-US">SingleTon&lt;Master&gt;</span>
				<span style="FONT-FAMILY: 宋体">这样的使用，如果传入的类型不同，难道传出的</span>
				<span lang="EN-US">static</span>
				<span style="FONT-FAMILY: 宋体">是一样的？不可能吧，如果打印出</span>
				<span lang="EN-US">this</span>
				<span style="FONT-FAMILY: 宋体">指针看看呢？抽空我再试试。</span>
				<span lang="EN-US">SingleTon</span>
				<span style="FONT-FAMILY: 宋体">在游戏设计中是相当重要的设计模式，大家一定要好好学习。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
				<span style="FONT-FAMILY: 宋体">认证过程</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">Wow</span>
				<span style="FONT-FAMILY: 宋体">的服务器有两部分组成：</span>
				<span lang="EN-US">Logon Server</span>
				<span style="FONT-FAMILY: 宋体">（以下简称</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">）和</span>
				<span lang="EN-US">Realm Server</span>
				<span style="FONT-FAMILY: 宋体">（以下简称</span>
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">接受来自</span>
				<span lang="EN-US">Wow</span>
				<span style="FONT-FAMILY: 宋体">客户端的连接，主要有以下几步完成：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">检查客户端版本区域等信息，检察账号密码</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">开始</span>
				<span lang="EN-US">/</span>
				<span style="FONT-FAMILY: 宋体">继续传送</span>
				<span lang="EN-US">Patch</span>
				<span style="FONT-FAMILY: 宋体">（如果有）</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">与客户端进行</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">的加密会话，把生成的密匙写入数据库</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">根据客户端请求发送</span>
				<span lang="EN-US">Realms</span>
				<span style="FONT-FAMILY: 宋体">列表</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">当客户端选择好</span>
				<span lang="EN-US">Realms</span>
				<span style="FONT-FAMILY: 宋体">后，客户端就从</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">断开，连接到</span>
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">上：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">认证，使用刚才生成的客户端密匙</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如通过，进行游戏循环的交互</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">使用相同的数据库，</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">密匙被</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">生成并写入</span>
				<span lang="EN-US">DB</span>
				<span style="FONT-FAMILY: 宋体">后还要由</span>
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">读取出来进行下一步的认证。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<?xml:namespace prefix = o /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
				<span lang="EN-US">Logon Server</span>
				<span style="FONT-FAMILY: 宋体">详解</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">基本的连接过程如下：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">客户端准备连接，发送</span>
				<span lang="EN-US">CMD_AUTH_LOGON_CHALLENGE</span>
				<span style="FONT-FAMILY: 宋体">数据包，包含了所有登陆所需要的数据比如用户名密码等</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">服务端返回</span>
				<span lang="EN-US">CMD_AUTH_LOGON_CHALLENGE</span>
				<span style="FONT-FAMILY: 宋体">数据包，填充字段包括有效验证，以及计算好的服务端</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">数据</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如果有效，客户端发送</span>
				<span lang="EN-US">CMD_AUTH_LOGON_PROOF</span>
				<span style="FONT-FAMILY: 宋体">数据包，并把自己计算的</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">数据填充进去</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">服务端进行验证，发送回</span>
				<span lang="EN-US">CMD_AUTH_LOGON_PROOF</span>
				<span style="FONT-FAMILY: 宋体">，包含了</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">验证的结果</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如果一切正常，客户端发送</span>
				<span lang="EN-US">CMD_REALM_LIST</span>
				<span style="FONT-FAMILY: 宋体">数据包，请求发送有效的</span>
				<span lang="EN-US">Realm</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">服务器回复</span>
				<span lang="EN-US">CMD_REALM_LIST</span>
				<span style="FONT-FAMILY: 宋体">数据报，并填充过客户端需要的</span>
				<span lang="EN-US">Realm</span>
				<span style="FONT-FAMILY: 宋体">数据</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">客户端的</span>
				<span lang="EN-US">Realm</span>
				<span style="FONT-FAMILY: 宋体">列表每隔</span>
				<span lang="EN-US">3-4</span>
				<span style="FONT-FAMILY: 宋体">秒就会从服务器端刷新一次。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
				<span style="FONT-FAMILY: 宋体">这个</span>
				<span lang="EN-US">SPR6</span>
				<span style="FONT-FAMILY: 宋体">是一种什么样的加密手段呢？以前我也没有用过，看得最多的是</span>
				<span lang="EN-US">MD5SHA</span>
				<span style="FONT-FAMILY: 宋体">等</span>
				<span lang="EN-US">hash</span>
				<span style="FONT-FAMILY: 宋体">算法。</span>
				<span lang="EN-US">SPR</span>
				<span style="FONT-FAMILY: 宋体">算法吸取了</span>
				<span lang="EN-US">EKE</span>
				<span style="FONT-FAMILY: 宋体">类型算法的优点进行了改进，非常适合于网络的认证服务，如果我没有记错，</span>
				<span lang="EN-US">J2EE</span>
				<span style="FONT-FAMILY: 宋体">包含了这个算法的实现。下面简单介绍一下</span>
				<span lang="EN-US">SRP6a</span>
				<span style="FONT-FAMILY: 宋体">运作机制，原文见这里。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">N<span>     </span>N = 2q + 1</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">q</span>
				<span style="FONT-FAMILY: 宋体">是一个素数，下面所有的取模运算都和这个</span>
				<span lang="EN-US">N</span>
				<span style="FONT-FAMILY: 宋体">有关</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
				</span>
				<span lang="EN-US">g <span>    </span></span>
				<span style="FONT-FAMILY: 宋体">一个</span>
				<span lang="EN-US">N</span>
				<span style="FONT-FAMILY: 宋体">的模数，应该是</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个巨大的素数乘得来</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">k<span>     </span>k = H(N,G) </span>
				<span style="FONT-FAMILY: 宋体">在</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">中</span>
				<span lang="EN-US">k = 3</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">s<span>      </span>User’s Salt</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">I<span>      </span></span>
				<span style="FONT-FAMILY: 宋体">用户名</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">p<span>     </span></span>
				<span style="FONT-FAMILY: 宋体">明文密码</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">H()<span>  </span></span>
				<span style="FONT-FAMILY: 宋体">单向</span>
				<span lang="EN-US">hash</span>
				<span style="FONT-FAMILY: 宋体">函数</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">^<span>      </span></span>
				<span style="FONT-FAMILY: 宋体">求幂运算</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">u<span>     </span></span>
				<span style="FONT-FAMILY: 宋体">随机数</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">a,b<span>   </span></span>
				<span style="FONT-FAMILY: 宋体">保密的临时数字</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">A,B<span>  </span></span>
				<span style="FONT-FAMILY: 宋体">公开的临时数字</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">x<span>     </span></span>
				<span style="FONT-FAMILY: 宋体">私有密匙（从</span>
				<span lang="EN-US">p</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">s</span>
				<span style="FONT-FAMILY: 宋体">计算得来）</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">v<span>     </span></span>
				<span style="FONT-FAMILY: 宋体">密码验证数字</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">其中</span>
				<span lang="EN-US">x<span>  </span>=<span>  </span>H(s,p)</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">v = g ^ x</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">s</span>
				<span style="FONT-FAMILY: 宋体">是随机选择的，</span>
				<span lang="EN-US">v</span>
				<span style="FONT-FAMILY: 宋体">用来将来验证密码。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">主机将</span>
				<span lang="EN-US">{ I,s,v }</span>
				<span style="FONT-FAMILY: 宋体">存入数据库。认证的过程如下：</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">客户向主机发送</span>
				<span lang="EN-US">I</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">A = g ^ a</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">a</span>
				<span style="FONT-FAMILY: 宋体">是一个随机数）</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">主机向客户发送</span>
				<span lang="EN-US">s</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">B = kv + g^b</span>
				<span style="FONT-FAMILY: 宋体">（发送</span>
				<span lang="EN-US">salt</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">b</span>
				<span style="FONT-FAMILY: 宋体">是一个随机数字）</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">双方同时计算</span>
				<span lang="EN-US">u = H(A,B)</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">客户计算机算</span>
				<span lang="EN-US">x = H(s,p)</span>
				<span style="FONT-FAMILY: 宋体">（开始</span>
				<span lang="EN-US">hash</span>
				<span style="FONT-FAMILY: 宋体">密码），</span>
				<span lang="EN-US">S = ((B - kg^x) ^ (a + ux) )</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">K = H(S)</span>
				<span style="FONT-FAMILY: 宋体">，（开始计算会话</span>
				<span lang="EN-US">Key</span>
				<span style="FONT-FAMILY: 宋体">）</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">主机计算</span>
				<span lang="EN-US">S = (Av^u)^b</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">K = H(S)</span>
				<span style="FONT-FAMILY: 宋体">，也生成会话</span>
				<span lang="EN-US">Key</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">为了完成认证，双方交换</span>
				<span lang="EN-US">Key</span>
				<span style="FONT-FAMILY: 宋体">，各自进行如下的计算：</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">客户接收到来自主机的</span>
				<span lang="EN-US">key</span>
				<span style="FONT-FAMILY: 宋体">后，计算</span>
				<span lang="EN-US">H(A,M,K)</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">同理，主机计算</span>
				<span lang="EN-US">M = H(H(N) xor H(g), H(I), s, A, B, K)</span>
				<span style="FONT-FAMILY: 宋体">，验证是否合自己储存的数值匹配。至此完成验证过程。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
				<span lang="EN-US">
						<span>三、</span>
				</span>
				<span lang="EN-US">Realm Server</span>
				<span style="FONT-FAMILY: 宋体">详解</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">从</span>
				<span lang="EN-US">LS</span>
				<span style="FONT-FAMILY: 宋体">断开后，开始和</span>
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">认证：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">连接到</span>
				<span lang="EN-US">RS</span>
				<span style="FONT-FAMILY: 宋体">，向服务器发送</span>
				<span lang="EN-US">SMSG_AUTH_CHALLENGE</span>
				<span style="FONT-FAMILY: 宋体">数据包，包含上次所用的随机种子</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">服务器发送回</span>
				<span lang="EN-US">SMSG_AUTH_CHALLENG</span>
				<span style="FONT-FAMILY: 宋体">。客户端从服务器端发送回来的种子和</span>
				<span lang="EN-US">SRP6</span>
				<span style="FONT-FAMILY: 宋体">数据中产生随机种子，生成</span>
				<span lang="EN-US">SHA1</span>
				<span style="FONT-FAMILY: 宋体">字符串，用这些数据生成</span>
				<span lang="EN-US">CMSG_AUITH_SESSION</span>
				<span style="FONT-FAMILY: 宋体">数据包，发送给服务端。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">需要注意的是，这个过程是没有经过加密的。当服务端收到认证回复后，通过客户端产生的种子也生成一个</span>
				<span lang="EN-US">SHA1</span>
				<span style="FONT-FAMILY: 宋体">串和来自客户端的进行对比，如果相同，一切</span>
				<span lang="EN-US">OK</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">下面看一下对账号创建的角色等操作进行分析。一个账号最多可以建</span>
				<span lang="EN-US">50</span>
				<span style="FONT-FAMILY: 宋体">个角色吧，我还没有玩过，只是看了一下</span>
				<span lang="EN-US">Manual</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"> <span style="FONT-FAMILY: 宋体">客户端发送一个</span><span lang="EN-US">CMSG_CHAR_ENUM</span><span style="FONT-FAMILY: 宋体">数据包请求接受角色</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">服务端发送回包含所有角色信息的</span>
				<span lang="EN-US">CMSG_CHAR_ENUM</span>
				<span style="FONT-FAMILY: 宋体">数据包</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">这里客户端可以对这些角色进行操作了，</span>
				<span lang="EN-US">CMSG_CHAR_CREATE</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">CMSG_CHAR_DELETE</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">CMSG_CHAR_PLAYER_LOGIN</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">角色登陆完成后，服务器发送回</span>
				<span lang="EN-US">SMSG_CHAR_DATA</span>
				<span style="FONT-FAMILY: 宋体">数据包</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 21pt">
				<span style="FONT-FAMILY: 宋体">
						<br />在游戏循环中是如何操作的呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如果玩家立刻退出游戏，那么客户端发送</span>
				<span lang="EN-US">CMSG_PLAYER_LOGOUT</span>
				<span style="FONT-FAMILY: 宋体">，服务器回复</span>
				<span lang="EN-US">SMSG_LOGOUT_COMPLETE</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如果玩家选择稍后退出游戏，发送</span>
				<span lang="EN-US">CMSG_LOGOUT_REQUEST</span>
				<span style="FONT-FAMILY: 宋体">。服务端回复</span>
				<span lang="EN-US">SMSG_LOGOUT_RESPONSE</span>
				<span style="FONT-FAMILY: 宋体">。如果玩家在倒计时阶段退出，发送</span>
				<span lang="EN-US">CMSG_PLAYER_LOGOUT</span>
				<span style="FONT-FAMILY: 宋体">，那么玩家的角色依旧等倒计时完成后再退出。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-FAMILY: 宋体">如果玩家中断了退出继续游戏，发送</span>
				<span lang="EN-US">CMSG_LOGOUT_CANCEL</span>
				<span style="FONT-FAMILY: 宋体">，服务器回复</span>
				<span lang="EN-US">SMSG_LOGOUT_CANCEL_ACK</span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cppblog.com/Jedimaster/aggbug/13674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-10-14 16:27 <a href="http://www.cppblog.com/Jedimaster/archive/2006/10/14/13674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>World Of Warcraft Server Source Topic</title><link>http://www.cppblog.com/Jedimaster/archive/2006/10/05/13373.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 05 Oct 2006 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/10/05/13373.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/13373.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/10/05/13373.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/13373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/13373.html</trackback:ping><description><![CDATA[
		<font color="#ff0000" size="4">声明：World Of Warcraft，魔兽世界相关程序的源代码所有权归暴雪公司Blizzard所有。WowWow只是一个Wow的服务器端的模拟程序，由俄罗斯黑客逆向工程得来，在这里仅供学习网络游戏服务器端或者交流之用，没有任何来自于暴雪公司或者及其中国运行商九城的源代码。任何个人或者组织使用此源代码经营可能违反法律的事业活动与本人无关。特此声明。</font>
		<br />
		<br />讨厌中国的这些个破网站，下载源代码竟然还要花钱申请什么破VIP，殊不知sf.net中好的代码多的是。<br /><br />这个是我从国外的一个论坛中拖回来的，由于自己的硬盘装不下Wow客户端所以也就没有测试过，有条件的可以试试看。<br /><br />我打算花些时间用C++重新写一遍，虽然说已经有了类似的Mangos，实在不喜欢C# JAVA之类的虚拟机语言。.net人不要跳出来和我争C#不是虚拟机软件云云，懒得搭理。编译出来的代码很小，程序启动速度奇慢无比，还必须要.net Frameworks的支持，麻烦。<br /><br />最早的是WowEmu，许多单机版Wow附带的也就是这个我就不列出地址了，BT上多的是。<br /><br />然后就是Wowwow，可是它的内核代码是不公开的，你可以看到decompiler云云<br /><a href="http://pickup.mofile.com/7217173990147883">下载地址</a><br />附上一个有一些代码的Wowwow Alpha v8.3<br /><a target="" class="" title="" href="http://pickup.mofile.com/1611571290444730">下载地址</a><br /><br />目前我正在分析的是Mangos，老巢竟然在sf.net中，介绍是一点没有提到World of War，可是实际上它运行的就是它。<br />去<a href="http://sourceforge.net/projects/mangos">这里</a>吧<br /><br />欢迎交流，如果您觉得好请回复我一下谢谢咯~~~<br /><img src ="http://www.cppblog.com/Jedimaster/aggbug/13373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-10-05 13:59 <a href="http://www.cppblog.com/Jedimaster/archive/2006/10/05/13373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用SIMD指令优化程序之抛砖引玉</title><link>http://www.cppblog.com/Jedimaster/archive/2006/08/24/11650.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 24 Aug 2006 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/08/24/11650.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/11650.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/08/24/11650.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/11650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/11650.html</trackback:ping><description><![CDATA[
		<span style="FONT-FAMILY: 宋体">
				<?xml:namespace prefix = o /?>
				<o:p>
				</o:p>小谈</span>
		<span lang="EN-US">CPU</span>
		<span style="FONT-FAMILY: 宋体">缓存体系</span>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">　　现在的</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">依旧采用冯诺伊曼体系，喜欢像傻子一样从头执行到尾，中途没有任何的跳转停顿等待。可是现实情况是，大部分程序里面还是少不了</span>
				<span lang="EN-US">IF ELSE</span>
				<span style="FONT-FAMILY: 宋体">之类的判断，循环就更加得多了。如何优化循环大家可以自己琢磨，其实不难，可以参考一下《高质量</span>
				<span lang="EN-US">C\C++</span>
				<span style="FONT-FAMILY: 宋体">编程指南》</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">　　现在</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">上都有</span>
				<span lang="EN-US">Level 1</span>
				<span style="FONT-FAMILY: 宋体">指令缓存（又叫做</span>
				<span lang="EN-US">L1 Trace</span>
				<span style="FONT-FAMILY: 宋体">）与</span>
				<span lang="EN-US">Level 1</span>
				<span style="FONT-FAMILY: 宋体">数据缓存（</span>
				<span lang="EN-US">L1 Data Cache</span>
				<span style="FONT-FAMILY: 宋体">）。</span>
				<span lang="EN-US">PMMX</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">P2</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">P3</span>
				<span style="FONT-FAMILY: 宋体">为二者都准备了</span>
				<span lang="EN-US">16kb</span>
				<span style="FONT-FAMILY: 宋体">，我的</span>
				<span lang="EN-US">P4 Northwood</span>
				<span style="FONT-FAMILY: 宋体">（以下简称</span>
				<span lang="EN-US">P4NW</span>
				<span style="FONT-FAMILY: 宋体">）有</span>
				<span lang="EN-US">8kbL1</span>
				<span style="FONT-FAMILY: 宋体">数据缓存和</span>
				<span lang="EN-US">12kb</span>
				<span style="FONT-FAMILY: 宋体">指令缓存。</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">读取</span>
				<span lang="EN-US">L1 Data Cache</span>
				<span style="FONT-FAMILY: 宋体">中的数据只需要</span>
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">个时钟周期，速度非常快，应该是仅次于寄存器了。数据缓存是由</span>
				<span lang="EN-US">256</span>
				<span style="FONT-FAMILY: 宋体">或者</span>
				<span lang="EN-US">512</span>
				<span style="FONT-FAMILY: 宋体">行</span>
				<span lang="EN-US">32bytes</span>
				<span style="FONT-FAMILY: 宋体">组成的，也就是</span>
				<span lang="EN-US">32bytes</span>
				<span style="FONT-FAMILY: 宋体">对齐的，而</span>
				<span lang="EN-US">P4NW</span>
				<span style="FONT-FAMILY: 宋体">是</span>
				<span lang="EN-US">64bytes</span>
				<span style="FONT-FAMILY: 宋体">字节对齐的，并行</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">路，总共</span>
				<span lang="EN-US">128</span>
				<span style="FONT-FAMILY: 宋体">行。当你处理的数据没有载入缓存的时候，</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">将从内存读取缓存行大小的数据，所以缓存行总是对齐到能被</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">整除的物理地址。</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">对</span>
				<span lang="EN-US">L1</span>
				<span style="FONT-FAMILY: 宋体">数据缓存中的数据进行操作是最快速的。所以推荐内存地址最起码是</span>
				<span lang="EN-US">32byte</span>
				<span style="FONT-FAMILY: 宋体">对齐的。目前编译器在这个地方的优化已经非常好了，一般都是</span>
				<span lang="EN-US">4byte</span>
				<span style="FONT-FAMILY: 宋体">对齐，当然也都是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">对齐的。在后面你将会看到，</span>
				<span lang="EN-US">SSE2</span>
				<span style="FONT-FAMILY: 宋体">要求数据是</span>
				<span lang="EN-US">16</span>
				<span style="FONT-FAMILY: 宋体">字节对齐的。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span> </span>
				</span>
				<span style="FONT-FAMILY: 宋体">　　缓存类似一个</span>
				<span lang="EN-US">C++ set</span>
				<span style="FONT-FAMILY: 宋体">容器，但是不能赋值到一个任意的内存地址。每行本身都有</span>
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">个</span>
				<span lang="EN-US">7bit</span>
				<span style="FONT-FAMILY: 宋体">大小的关联值（</span>
				<span lang="EN-US">set value</span>
				<span style="FONT-FAMILY: 宋体">）要和目标内存地址的</span>
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 宋体">到</span>
				<span lang="EN-US">11</span>
				<span style="FONT-FAMILY: 宋体">位对应（</span>
				<span lang="EN-US">0-4</span>
				<span style="FONT-FAMILY: 宋体">位已经忽略了），也可以理解为，关联值是内存段地址的一部分。</span>
				<span lang="EN-US">PPro</span>
				<span style="FONT-FAMILY: 宋体">中，有</span>
				<span lang="EN-US">128</span>
				<span style="FONT-FAMILY: 宋体">个关联值对应到</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">行，所以最多可以为任意的内存单元准备</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个缓存行。</span>
				<span lang="EN-US">PMMX P2 P3 P4NW</span>
				<span style="FONT-FAMILY: 宋体">有</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">个。由于内存是分段的，所以说</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">只能为，</span>
				<span lang="EN-US">5-11</span>
				<span style="FONT-FAMILY: 宋体">位地址相同的内存准备</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">或者</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">个不同的缓存行。如何为两个内存地址赋予相同的关联值呢？把</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个地址的低</span>
				<span lang="EN-US">5bit</span>
				<span style="FONT-FAMILY: 宋体">去掉，这样就能被</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">整除了。如果这</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个截断了的地址都是</span>
				<span lang="EN-US">4096</span>
				<span style="FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US">1000H</span>
				<span style="FONT-FAMILY: 宋体">）的倍数，那么这两个地址就有了相同的关联值。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span> </span>
				</span>
				<span style="FONT-FAMILY: 宋体">　　让我们用汇编加深一下印象，假设</span>
				<span lang="EN-US">ESI</span>
				<span style="FONT-FAMILY: 宋体">中是</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">对齐的地址。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<span> </span>
						<span>                                        </span>AGAIN:<span>  </span>MOV<span>  </span>EAX,<span>  </span>[ESI]</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 147pt; TEXT-INDENT: 26.25pt">
				<span lang="EN-US">MOV<span>  </span>EBX,<span>  </span>[ESI+13*4096+4]</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 147pt; TEXT-INDENT: 26.25pt">
				<span lang="EN-US">MOV <span> </span>ECX,<span>  </span>[ESI+20*4096+28]</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 147pt; TEXT-INDENT: 26.25pt">
				<span lang="EN-US">DEC<span>  </span><span> </span>EDX</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 147pt; TEXT-INDENT: 26.25pt">
				<span lang="EN-US">JNZ <span>  </span>AGAIN</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">　　</span>
				<span lang="EN-US">Oh Year</span>
				<span style="FONT-FAMILY: 宋体">，这里</span>
				<span lang="EN-US">3</span>
				<span style="FONT-FAMILY: 宋体">个地址都有相同的关联值，而且地址跨度都超过了数据缓存的大小，可这个循环在</span>
				<span lang="EN-US">PPro</span>
				<span style="FONT-FAMILY: 宋体">上效率会相当低。当你想读取</span>
				<span lang="EN-US">ECX</span>
				<span style="FONT-FAMILY: 宋体">的值的时候，将没有空闲的缓存行了</span>
				<span style="FONT-FAMILY: 宋体">——</span>
				<span style="FONT-FAMILY: 宋体">因为共享一个关联值，而且</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">行已经被使用了。此时</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">将腾出最近使用的</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个缓存行，一个已经被</span>
				<span lang="EN-US">EAX</span>
				<span style="FONT-FAMILY: 宋体">使用。然后</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">把这个缓存行用</span>
				<span lang="EN-US">[ESI+20*4096]</span>
				<span style="FONT-FAMILY: 宋体">到</span>
				<span lang="EN-US">[ESI+20*4096+31]</span>
				<span style="FONT-FAMILY: 宋体">的内存数据填充，然后从缓存中读取</span>
				<span lang="EN-US">ECX</span>
				<span style="FONT-FAMILY: 宋体">。听起来好象相当的烦琐。更加糟糕的是，当又需要读取</span>
				<span lang="EN-US">EAX</span>
				<span style="FONT-FAMILY: 宋体">的时候，还需要重复上述的过程，需要对内存缓存来回操作，效率相当的低，甚至不如不用缓存。可是，如果我们把第三行改成：</span>
		</p>
		<p class="MsoNormal" align="center">
				<span lang="EN-US">MOV<span>  </span>ECX,<span>  </span>[ESI+20*4096+32]</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">　　哦，不好，看起来，我们的地址超过了</span>
				<span lang="EN-US">32</span>
				<span style="FONT-FAMILY: 宋体">，不能被整除了。可是这样有了不同的关联值，也就意味着有了</span>
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">个新行，不再共享可怜的</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个行。这样一来，对三个寄存器的操作就不需要反复的用</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个缓存行进行调度了，各有一个了。嘿嘿，这次只需要</span>
				<span lang="EN-US">3</span>
				<span style="FONT-FAMILY: 宋体">个时钟周期了，而上一个要</span>
				<span lang="EN-US">60</span>
				<span style="FONT-FAMILY: 宋体">个周期。这是在</span>
				<span lang="EN-US">PPro</span>
				<span style="FONT-FAMILY: 宋体">上的，在后来的</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">中都是</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">路的，也就不存在上面的问题了。搞笑的是，</span>
				<span lang="EN-US">Intel</span>
				<span style="FONT-FAMILY: 宋体">的文档却错误的说</span>
				<span lang="EN-US">P2</span>
				<span style="FONT-FAMILY: 宋体">的缓存是</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">路的。虽然说很少人在用那么古老的</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">，可是其中的道理大家应该明白。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">　　可是判断要访问的部分数据是否有相同的关联值，也就是关于缓存是否能够命中的问题，是相当困难的，汇编还好，用高等级语言编译过的程序鬼知道是否对缓存做过优化呢。所以么，推荐，在程序的核心部分，对性能要求最高的部分，先对齐数据，然后确保使用的单个数据块不要超过缓存大小，</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个数据块，单个不要超过缓存大小的一半（仔细想想为什么，因为关联值的问题，可以缓存分为两部分处理两块）。可是大部分情况下，我们都是使用远比数据缓存大的多的结构，以及编译器自己返回的指针，然后为了优化你可能希望把所有频繁使用的变量放到一个连续的数据块中以充分利用缓存。我们可以这样做，把静态变量数值拷贝到栈中的局部变量中，等子函数或者循环结束后再拷贝回来。这样一来就相当于把静态变量放入了连续的地址空间中去。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">当读取的数据不在</span>
				<span lang="EN-US">L1 Cache</span>
				<span style="FONT-FAMILY: 宋体">内时，</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">将要从</span>
				<span lang="EN-US">L2 Cache</span>
				<span style="FONT-FAMILY: 宋体">读取</span>
				<span lang="EN-US">L1</span>
				<span style="FONT-FAMILY: 宋体">缓存行大小的数据到</span>
				<span lang="EN-US">L1</span>
				<span style="FONT-FAMILY: 宋体">里去，大概需要</span>
				<span lang="EN-US">200ns</span>
				<span style="FONT-FAMILY: 宋体">的时间（也就是</span>
				<span lang="EN-US">100Mhz</span>
				<span style="FONT-FAMILY: 宋体">系统的</span>
				<span lang="EN-US">20</span>
				<span style="FONT-FAMILY: 宋体">个时钟周期），但是直到你能够使用这些数据前，又需要有</span>
				<span lang="EN-US">50-100ns</span>
				<span style="FONT-FAMILY: 宋体">的延迟。最糟糕的是，如果数据也不在</span>
				<span lang="EN-US">L2 Cache</span>
				<span style="FONT-FAMILY: 宋体">中，那么就只能从最慢速的内存里读取了，内存的龟速哪能和全速的缓存相比。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">好了，关于缓存的知识可以就此打住了，下面开始讲如何优化缓存。无非就是</span>
				<span lang="EN-US">3</span>
				<span style="FONT-FAMILY: 宋体">种方法，硬件预取（</span>
				<span lang="EN-US">Prefetch</span>
				<span style="FONT-FAMILY: 宋体">）、软件预取、使用缓存指令。关于预取的注意事项主要有这些：</span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US"><span>1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></span>&lt;!--[endif]--&gt; <span style="FONT-FAMILY: 宋体">合理安排内存的数据，使用块结构，提高缓存命中率。</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US"><span>2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></span>&lt;!--[endif]--&gt; <span style="FONT-FAMILY: 宋体">使用编译器提供的预取指令。比如</span><span lang="EN-US">ICC</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">_mm_prefetch _mm_stream</span><span style="FONT-FAMILY: 宋体">，甚至</span><span lang="EN-US">_mm_load</span><span style="FONT-FAMILY: 宋体">等比较“传统”的指令。</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US"><span>3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></span>&lt;!--[endif]--&gt; <span style="FONT-FAMILY: 宋体">尽可能少的使用全局的变量或者指针。</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US"><span>4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></span>&lt;!--[endif]--&gt; <span style="FONT-FAMILY: 宋体">程序尽可能少的进行判断跳转循环。</span></p>
		<p class="MsoNormal" style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt">&lt;!--[if !supportLists]--&gt; <span lang="EN-US"><span>5、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  </span></span></span>&lt;!--[endif]--&gt; <span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">const</span><span style="FONT-FAMILY: 宋体">标记，不要在代码中混合</span><span lang="EN-US">register</span><span style="FONT-FAMILY: 宋体">声明。</span></p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">不过要提醒一句，真正提高程序效率的方法不是那种，从头到尾由于外科手术般的解剖，一个一个地方的优化，请抓住程序最核心的部分进行优化，记住</span>
				<span lang="EN-US">80-20</span>
				<span style="FONT-FAMILY: 宋体">规则。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">使用</span>
				<span lang="EN-US">SIMD</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">先复习一下对齐指令，</span>
				<span lang="EN-US">__declspec(aliagn(#))</span>
				<span style="FONT-FAMILY: 宋体">，</span>
				<span lang="EN-US">#</span>
				<span style="FONT-FAMILY: 宋体">替换为字节数。比如想声明一个</span>
				<span lang="EN-US">16</span>
				<span style="FONT-FAMILY: 宋体">字结对齐的浮点数组，</span>
				<span lang="EN-US">__declspec(aliagn(16)) float Array[128]</span>
				<span style="FONT-FAMILY: 宋体">。需要注意的是，最好充分了解你</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">的类型，支持哪些指令集。</span>
				<span lang="EN-US">SIMD</span>
				<span style="FONT-FAMILY: 宋体">主要使用在需要同时操作大量数据的工作领域，比如</span>
				<span lang="EN-US">3D</span>
				<span style="FONT-FAMILY: 宋体">图形处理（游戏），物理建模（</span>
				<span lang="EN-US">CAD</span>
				<span style="FONT-FAMILY: 宋体">），加密，以及科学计算领域。据我所知，目前</span>
				<span lang="EN-US">GPGPU</span>
				<span style="FONT-FAMILY: 宋体">也是使用</span>
				<span lang="EN-US">SIMD</span>
				<span style="FONT-FAMILY: 宋体">的代表之一。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">MMX</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">主要特性：</span>
				<span lang="EN-US">57</span>
				<span style="FONT-FAMILY: 宋体">条指令，</span>
				<span lang="EN-US">64bit</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">FP</span>
				<span style="FONT-FAMILY: 宋体">寄存器</span>
				<span lang="EN-US">MM0-MM7</span>
				<span style="FONT-FAMILY: 宋体">，对齐到</span>
				<span lang="EN-US">8</span>
				<span style="FONT-FAMILY: 宋体">个</span>
				<span lang="EN-US">80bit</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">FP</span>
				<span style="FONT-FAMILY: 宋体">寄存器</span>
				<span lang="EN-US">ST0-ST7</span>
				<span style="FONT-FAMILY: 宋体">。需要数据</span>
				<span lang="EN-US">8</span>
				<span style="FONT-FAMILY: 宋体">字节对齐，也就是使用</span>
				<span lang="EN-US">Packed</span>
				<span style="FONT-FAMILY: 宋体">数字。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">PS</span>
				<span style="FONT-FAMILY: 宋体">：这里冒出了一个问题，为什么</span>
				<span lang="EN-US">Intel</span>
				<span style="FONT-FAMILY: 宋体">要把</span>
				<span lang="EN-US">MMX</span>
				<span style="FONT-FAMILY: 宋体">的寄存器和</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">的寄存器混合起来使用呢？因为这里牵涉到一个</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">状态切换问题，后面会提到，当你在一段代码中又要用到</span>
				<span lang="EN-US">MMX</span>
				<span style="FONT-FAMILY: 宋体">指令又要用到传统的</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">指令，那么需要保存</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">状态，或者退出</span>
				<span lang="EN-US">MMX</span>
				<span style="FONT-FAMILY: 宋体">。可是这种操作对于</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">来说非常昂贵，而且对于多任务操作系统来说，近乎于不可能完成的任务</span>
				<span style="FONT-FAMILY: 宋体">——</span>
				<span style="FONT-FAMILY: 宋体">同时有许多程序，有些需要</span>
				<span lang="EN-US">MMX</span>
				<span style="FONT-FAMILY: 宋体">，有些不需要，而正确地进行调度会变得非常困难。所以</span>
				<span lang="EN-US">Intel</span>
				<span style="FONT-FAMILY: 宋体">将保存状态的工作完全交给了</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">自己，软件人员无须作太多这方面的工作，这样一来，就向前向后兼容了多任务操作系统，比如</span>
				<span lang="EN-US">Windows</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">Linux</span>
				<span style="FONT-FAMILY: 宋体">。后来随着操作系统和</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">的不断升级，操作系统开发人员发布了一个补丁包，就可以让操作系统使用新的寄存器。这时人们都发现</span>
				<span lang="EN-US">Intel</span>
				<span style="FONT-FAMILY: 宋体">的这种做法是相当短视的，这可以当作一个重大的失误。后来</span>
				<span lang="EN-US">Intel</span>
				<span style="FONT-FAMILY: 宋体">通过引入了新的浮点指令集，这时才加入</span>
				<span lang="EN-US">XMM</span>
				<span style="FONT-FAMILY: 宋体">寄存器。可造成这段故事的原因却根本不是技术问题，保证兼容性也是一个方面，总之真的说不清楚。你只要记得无法同时使用</span>
				<span lang="EN-US">MMX</span>
				<span style="FONT-FAMILY: 宋体">与</span>
				<span lang="EN-US">FPU</span>
				<span style="FONT-FAMILY: 宋体">就可以了，</span>
				<span lang="EN-US">CPU</span>
				<span style="FONT-FAMILY: 宋体">要进行模式切换。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">SSE1</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">主要特性：</span>
				<span lang="EN-US">128bit</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">FP</span>
				<span style="FONT-FAMILY: 宋体">寄存器</span>
				<span lang="EN-US">XMM0-XMM7</span>
				<span style="FONT-FAMILY: 宋体">。增加了数据预取指令。额外的</span>
				<span lang="EN-US">64bit</span>
				<span style="FONT-FAMILY: 宋体">整数支持。支持同时处理</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体">个单精度浮点数，也就是</span>
				<span lang="EN-US">C\C++</span>
				<span style="FONT-FAMILY: 宋体">里的</span>
				<span lang="EN-US">float</span>
				<span style="FONT-FAMILY: 宋体">。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">适用范围：多媒体信号处理</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">SSE2</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">主要特性：</span>
				<span lang="EN-US">128bit</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">FP</span>
				<span style="FONT-FAMILY: 宋体">寄存器支持处理同时处理</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">个双精度</span>
				<span lang="EN-US">double</span>
				<span style="FONT-FAMILY: 宋体">浮点数，以及</span>
				<span lang="EN-US">16byte 8word 4dword 2quadword</span>
				<span style="FONT-FAMILY: 宋体">整数。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">适用范围：</span>
				<span lang="EN-US">3D</span>
				<span style="FONT-FAMILY: 宋体">处理</span>
				<span style="FONT-FAMILY: 宋体">语音识别</span>
				<span style="FONT-FAMILY: 宋体">视频编码解码</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">SSE3</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">主要特性：增加支持非对称</span>
				<span lang="EN-US">asymmetric</span>
				<span style="FONT-FAMILY: 宋体">和水平</span>
				<span lang="EN-US">horizontal</span>
				<span style="FONT-FAMILY: 宋体">计算的</span>
				<span lang="EN-US">SIMD</span>
				<span style="FONT-FAMILY: 宋体">指令。为</span>
				<span lang="EN-US">SIMD</span>
				<span style="FONT-FAMILY: 宋体">提供了一条特殊的寄存器</span>
				<span lang="EN-US">load</span>
				<span style="FONT-FAMILY: 宋体">指令。线程同步指令。</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">适用范围：科学计算</span>
				<span style="FONT-FAMILY: 宋体">多线程程序<br /><o:p></o:p><br />手头工具</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">1</span>
				<span style="FONT-FAMILY: 宋体">、选择一个合适的编译器，推荐用</span>
				<span lang="EN-US">Intel C++ Compiler</span>
				<span style="FONT-FAMILY: 宋体">（以下简称</span>
				<span lang="EN-US">ICC</span>
				<span style="FONT-FAMILY: 宋体">），以及</span>
				<span lang="EN-US">Visual Studio .NET 2003</span>
				<span style="FONT-FAMILY: 宋体">及以上</span>
				<span lang="EN-US">IDE</span>
				<span style="FONT-FAMILY: 宋体">附带的</span>
				<span lang="EN-US">C++</span>
				<span style="FONT-FAMILY: 宋体">编译器。同时，</span>
				<span lang="EN-US">Microsoft C++ Compiler</span>
				<span style="FONT-FAMILY: 宋体">也支持</span>
				<span lang="EN-US">AMD</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">3DNow</span>
				<span style="FONT-FAMILY: 宋体">。</span>
				<span lang="EN-US">GCC C++ Compiler</span>
				<span style="FONT-FAMILY: 宋体">没有测试。</span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体">、</span>
				<b>
						<span lang="EN-US">Intel</span>
						<span style="FONT-FAMILY: 宋体">以及</span>
						<span lang="EN-US">AMD</span>
				</b>
				<span style="FONT-FAMILY: 宋体">
						<b>的汇编指令集手册。这个是必需的，强烈建议每个C++ Coder人手准备一份。</b>
						<br />
				</span>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">
						<o:p> </o:p>
						<u>所有的都用</u>
				</span>
				<u>
						<span lang="EN-US">C++</span>
						<span style="FONT-FAMILY: 宋体">混合变成的方式实现</span>
				</u>
		</p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体">使用范例：</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">向量乘法在</span>
				<span lang="EN-US">3D</span>
				<span style="FONT-FAMILY: 宋体">处理中非常非常多，多半用于计算单位矢量的夹角。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">我们先定义一个顶点结构。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体">
				</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="COLOR: rgb(0,0,0)">__declspec(align(</span>
				<span style="COLOR: rgb(0,0,0)">16</span>
				<span style="COLOR: rgb(0,0,0)">)) </span>
				<span style="COLOR: rgb(0,0,255)">struct</span>
				<span style="COLOR: rgb(0,0,0)"> Vertex{<br />    </span>
				<span style="COLOR: rgb(0,0,255)">float</span>
				<span style="COLOR: rgb(0,0,0)"> x,y,z,w;<br />};</span>
		</div>    16字节对齐的结构，其实本身也是16字节的东西。如果没有对齐，运行时会报错。<p></p><p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">w是其次坐标系的参数，处理向量的时候不需要用到。我的函数是这样的：</span></p><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,255)">float</span><span style="COLOR: rgb(0,0,0)"> Dot(Vertex</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v1,Vertex</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v2)<br />{<br />    Vertex tmp;<br />    __asm{<br />        MOV EAX,[v1];<br />        MOVAPS XMM0,[EAX];<br />        MOV EAX,[v2];<br />        MOVAPS XMM1,[EAX];<br />        MULPS XMM0,XMM1;<br />        MOVAPS tmp,XMM0;<br />    };<br />    </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> tmp.x </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp.y </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp.z;<br />};</span></div><br />    VC中反汇编之：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,0,255)">float</span><span style="COLOR: rgb(0,0,0)"> Dot(Vertex</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v1,Vertex</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v2)<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)">{<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)">0041C690  push        ebx  <br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)">0041C691  mov         ebx,esp <br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)">0041C693  sub         esp,</span><span style="COLOR: rgb(0,0,0)">8</span><span style="COLOR: rgb(0,0,0)"> <br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)">0041C696  and         esp,0FFFFFFF0h <br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)">0041C699  add         esp,</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)"> <br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)">0041C69C  push        ebp  <br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)">0041C69D  mov         ebp,dword ptr [ebx</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">] <br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)">0041C6A0  mov         dword ptr [esp</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">],ebp <br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">0041C6A4  mov         ebp,esp <br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)">0041C6A6  sub         esp,0E8h <br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)">0041C6AC  push        esi  <br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)">0041C6AD  push        edi  <br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)">0041C6AE  lea         edi,[ebp</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">0E8h] <br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">0041C6B4  mov         ecx,3Ah <br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">0041C6B9  mov         eax,0CCCCCCCCh <br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)">0041C6BE  rep stos    dword ptr [edi] <br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">    Vertex tmp;<br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">    __asm{<br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">        MOV EAX,[v1];<br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)">0041C6C0  mov         eax,dword ptr [v1] <br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM0,[EAX];<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">0041C6C3  movaps      xmm0,xmmword ptr [eax] <br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">        MOV EAX,[v2];<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">0041C6C6  mov         eax,dword ptr [v2] <br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM1,[EAX];<br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)">0041C6C9  movaps      xmm1,xmmword ptr [eax] <br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">        MULPS XMM0,XMM1;<br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">0041C6CC  mulps       xmm0,xmm1 <br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS tmp,XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)">0041C6CF  movaps      xmmword ptr [tmp],xmm0 <br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)">    };<br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> tmp.x </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp.y </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp.z;<br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)">0041C6D3  fld         dword ptr [tmp] <br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)">0041C6D6  fadd        dword ptr [ebp</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">1Ch] <br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">0041C6D9  fadd        dword ptr [ebp</span><span style="COLOR: rgb(0,0,0)">-</span><span style="COLOR: rgb(0,0,0)">18h] <br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)">};</span></div>    前面都是保护现场入Stack的代码，没有必要管。我之所以这样，在Stack中声明了一个零时变量返回之，是为了减少代码的行数。有兴趣地可以参考本文后面引用资料中的Intel范例，代码多的多，功能却一样。这样就可以利用SIMD计算点乘了。图示：<br />    这种顶点格式称为AoS（Array of structure），这种结构的好处是，能够和现有的程序结构，比如D3D中的FVF顶点格式，和GL中的顶点格式。但是，由于许多情况下，并没有使用第四各浮点数，这就让SIMD指令浪费了25%的性能。于是有了SoA格式，让我们重新来过。<br />    我借用了一下上面一个结构的指令，还是没有用_mm_128格式，让大家看得清楚一些：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">__declspec(align(</span><span style="COLOR: rgb(0,0,0)">16</span><span style="COLOR: rgb(0,0,0)">)) </span><span style="COLOR: rgb(0,0,255)">struct</span><span style="COLOR: rgb(0,0,0)"> Vertex_soa{<br />     </span><span style="COLOR: rgb(0,0,255)">float</span><span style="COLOR: rgb(0,0,0)"> x[</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">],y[</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">],z[</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">],w[</span><span style="COLOR: rgb(0,0,0)">4</span><span style="COLOR: rgb(0,0,0)">];<br />};</span></div>    依旧16字节对齐。计算函数如下：<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> Dot(Vertex_soa</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v1,Vertex</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> v2,</span><span style="COLOR: rgb(0,0,255)">float</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)"> result)<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)">{<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)">    Vertex tmp1,tmp2;<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)">    __asm{<br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)">        MOV ECX,v1;<br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)">        MOV EDX,v2;<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM7,[ECX];<br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM6,[ECX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">16</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM5,[ECX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">32</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM4,[ECX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">48</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM0,XMM7;<br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)">        UNPCKLPS XMM7,XMM6;<br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)">        MOVLPS [EDX],XMM7;<br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)">        MOVHPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">16</span><span style="COLOR: rgb(0,0,0)">],XMM7;<br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">        UNPCKHPS XMM0,XMM6;<br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)">        MOVLPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">32</span><span style="COLOR: rgb(0,0,0)">],XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)">        MOVHPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">48</span><span style="COLOR: rgb(0,0,0)">],XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM0,XMM5;<br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)">        UNPCKLPS XMM5,XMM4;<br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)">        UNPCKHPS XMM0,XMM4;<br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">        MOVLPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">8</span><span style="COLOR: rgb(0,0,0)">],XMM5;<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">        MOVHPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">24</span><span style="COLOR: rgb(0,0,0)">],XMM5;<br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">        MOVLPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">40</span><span style="COLOR: rgb(0,0,0)">],XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">        MOVHPS [EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">56</span><span style="COLOR: rgb(0,0,0)">],XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM3,[EDX];<br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM2,[EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">16</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM1,[EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">32</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS XMM0,[EDX</span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)">48</span><span style="COLOR: rgb(0,0,0)">];<br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)">        MULPS XMM3,XMM2;<br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">        MULPS XMM1,XMM0;<br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS tmp2,XMM1;<br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)">        MOVAPS tmp1,XMM3;<br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">    };<br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)">    result[</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">] </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> tmp1.x </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp1.y </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp1.z;<br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)">    result[</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,0)">] </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> tmp2.x </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp2.y </span><span style="COLOR: rgb(0,0,0)">+</span><span style="COLOR: rgb(0,0,0)"> tmp2.z;<br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,0,0)">};</span></div><span style="COLOR: rgb(0,0,255)"></span>    Oh Yeah，就是这样了，同时计算了1对乘法。我在代码中借用了一下前面的顶点结构，这样方便一些。至于SOA格式，请看前面的声明。很多代码都是转换Stack中的内存格式，转换成AOS格式，这样才能使用SIMD指令计算。<br /><br />    通过上面的演示，想必大家已经对SIMD有了个直观地认识，其实在自己的代码中加入这些是非常方便与容易的。虽然说现在的CPU性能已经提高了许多，性能也强了许多，可是在诸多对性能要求高的地方，还是非常烤烟程序员的水平的。<br /><br />    <b>欢迎大家拍砖！</b><br /><img src ="http://www.cppblog.com/Jedimaster/aggbug/11650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-08-24 15:37 <a href="http://www.cppblog.com/Jedimaster/archive/2006/08/24/11650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学汇编之CPU类型识别</title><link>http://www.cppblog.com/Jedimaster/archive/2006/08/18/11423.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Fri, 18 Aug 2006 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/08/18/11423.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/11423.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/08/18/11423.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/11423.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/11423.html</trackback:ping><description><![CDATA[为了以后优化算法，还是硬着头皮学了一下汇编，也就是C\C++与汇编的混合编程，帖一个类的代码，非常简单的东西，觉得还可以优化。识别CPU的型号，使用了Intel的CPUID指令，还没有来得及看AMD的资料，以后有空了我也做一个类似于CPUID一样的小工具呵呵。<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> CIntelCpuInfo{<br /></span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">:<br />    DWORD m_VersionInfo;<br />    DWORD m_Features;<br />    <br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> GetFeatures();<br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> GetVersionInfo();<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />    CIntelCpuInfo() {};<br />    </span><span style="color: rgb(0, 0, 0);">~</span><span style="color: rgb(0, 0, 0);">CIntelCpuInfo() {};<br />    </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> Show();<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> CIntelCpuInfo::Show()<br />{<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">GetVersionInfo();<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">GetFeatures();<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> CIntelCpuInfo::GetVersionInfo()<br />{<br />    DWORD VER;<br />    DWORD BACKUP;<br /><br />    DWORD STEP,MODEL,FAMILY;<br />    __asm{<br />        MOV EAX,01H;<br />        CPUID;<br />        MOV VER,EAX;<br />        MOV BACKUP,EAX;<br />        AND EAX,0000000FH;<br />        MOV STEP,EAX;<br />        MOV EAX,BACKUP;<br />        SHR EAX,</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />        AND EAX,0000000FH;<br />        MOV MODEL,EAX;<br />        MOV EAX,BACKUP;<br />        SHR EAX,</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">;<br />        AND EAX,0000000FH;<br />        MOV FAMILY,EAX;<br />    };<br />    cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Family ID : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">FAMILY</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> Stepping ID : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">STEP</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> Model : </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">MODEL</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />};<br /><br /></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> CIntelCpuInfo::GetFeatures()<br />{<br />    DWORD C,D;<br />    DWORD SSE3Tag;<br />    DWORD SSTEPTag;<br />    DWORD SSE2Tag;<br />    DWORD SSE1Tag;<br />    DWORD MMXTag;<br />    __asm{<br />        MOV EAX,01H;<br />        CPUID;<br />        MOV C,ECX;<br />        PUSH ECX;<br />        AND ECX,01H;<br />        MOV SSE3Tag,ECX;<br />        POP ECX;<br />        AND ECX,0080H;<br />        MOV SSTEPTag,ECX;<br />        SHR SSTEPTag,</span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">;<br />        MOV D,EDX;<br />        SHR EDX,</span><span style="color: rgb(0, 0, 0);">23</span><span style="color: rgb(0, 0, 0);">;<br />        PUSH EDX;<br />        PUSH EDX;<br />        AND EDX,01H;<br />        MOV MMXTag,EDX;<br />        POP EDX;<br />        SHR EDX,</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;<br />        AND EDX,01H;<br />        MOV SSE1Tag,EDX;<br />        POP EDX;<br />        SHR EDX,</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">;<br />        AND EDX,01H;<br />        MOV SSE2Tag,EDX;<br />    };<br />    cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SSE3 Support ? </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">SSE3Tag</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SSE2 Support ? </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">SSE2Tag</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SSE1 Support ? </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">SSE1Tag</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />    cout</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Enhanced SpeedStepping ? </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">SSTEPTag</span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);">endl;<br />};<br /></span></div>我的CPU是2002年下半年的，Intel Pentium 4 Northwood 1.8GA，嗬嗬，搞得多么先进一样。截图如下，<br /><br /><div align="center"><img src="http://www.cppblog.com/images/cppblog_com/jedimaster/2458/o_ASM.JPG" alt="o_ASM.JPG" border="0" height="154" width="497" /><br /><br /><div align="left">结果完全正确。有了一些经验，在以后的程序中，可以通过识别CPU类型进行额外的优化，以后好好的研究Intel的Manual。<br /></div></div><img src ="http://www.cppblog.com/Jedimaster/aggbug/11423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-08-18 22:15 <a href="http://www.cppblog.com/Jedimaster/archive/2006/08/18/11423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX系统不能统治桌面之理由 欢迎讨论</title><link>http://www.cppblog.com/Jedimaster/archive/2006/08/10/11109.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 10 Aug 2006 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/08/10/11109.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/11109.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/08/10/11109.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/11109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/11109.html</trackback:ping><description><![CDATA[
		<ol>
				<li>结构冗繁。尚不说安装一个普通的LINUX发行版需要多少包，就是包和包之间的依赖关系，可是比理顺肠子还困难一百倍。最讨厌看到的就是在命令行下兴冲冲的输入安装命令时跳出一个个require提示，得！插入碟一个一个安装吧。</li>
				<li>体积庞大。WINDOWS98多大？全部安装600M；2000多大？普通安装1.3G；XP多大？普通安装2.1G；VISTA还不知道。反正我知道SUSE已经用DVD装载了。这一点比M$先进！可是硬盘空间呢？是否系统真的需要那么多的东西么？非也</li>
				<li>工具花哨不统一。我知道LINUX FANS的水平很高，可是就是没有M$出的软件那么顺手实用，就拿播放器来说，各式各样的东西，从KDE自己的MP3播放器开始，到仿造WINAMP的播放器，还有各种CD播放器。WINDOWS下就是方便多了，ASPI+EAC可以搞定所有的CD抓取工作，foobar2000+Media Player Classic，搞定了音频视频。即使是对大多数人来说，也有诸如WMP，PowerDVD等对于入门用户也非常有亲和力的软件。这种高手充其量也是普通的Hacker，不是Engineer，更不是Professinal Developer。</li>
				<li>基础教育没有普及。好象还没有人给大多数入门者解释过X-WINDOWS是什么东西，当初我是花了不少时间才弄明白X11R6 XFree86 XServer等等就是是什么东西，然后才会安装NVIDIA的驱动程序，手动更改配置文件。也没有人解释过，当初人们如何用命令行访问http，访问NFS，大多数会用WINDOWS下的“网上邻居”，“CuteFTP”。如果想要推广LINUX，学校这一关不可忽视。可是……</li>
				<li>需要最起码让所有的人都要明白C\C++语言是怎么回事。想升级系统，先拿内核开刀。可是这个内核究竟是什么东西，为什么要编译？为什么编译时需要用到一个叫做makefile的东西？一切的一切，对于普通人来说，可是非常陡峭的学习曲线。</li>
				<li>开发人员没有一个完整强大的C\C++ IDE。IDE，最基本的功能莫过于工程管理和代码提示。Borland造了一个，那是为了Delphi，可是C\C++人员呢？难道还是vim敲字符？手动make？</li>
				<li>驱动程序规范不统一。有的驱动程序要求重新编译内核，以及各种各样的安装方式。3D是最要命的，除了NVIDIA积极外，其他的厂商看不出什么动作。还有3D API，纯软件跨平台的Mesa3D，还有一个GLX。</li>
		</ol>
<img src ="http://www.cppblog.com/Jedimaster/aggbug/11109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-08-10 21:25 <a href="http://www.cppblog.com/Jedimaster/archive/2006/08/10/11109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GPU水波模拟之关键提领</title><link>http://www.cppblog.com/Jedimaster/archive/2006/08/03/10801.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Thu, 03 Aug 2006 01:50:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/08/03/10801.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/10801.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/08/03/10801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/10801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/10801.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这些都是超出White Paper的经验总结，如有错误，请多多指正谢谢！　　1、使用哪个苦力　　你可以使用GPU或者是CPU，计算随时间变化的高程。听起来用GPU的Vertex Shader计算高程好像非常先进，其实不然。因为GPU与CPU的运作机制不同，每个FPS，传入时间Uniform变量会导致GPU效率低下，在NVIDIA的GPU优化指南中提到过这一点。所以我还是推荐用CPU计算高程，因为牵...&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2006/08/03/10801.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/10801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-08-03 09:50 <a href="http://www.cppblog.com/Jedimaster/archive/2006/08/03/10801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Direct3D 10 Preview 别人有翻译过 自己又翻译了一遍</title><link>http://www.cppblog.com/Jedimaster/archive/2006/08/01/10767.html</link><dc:creator>周波</dc:creator><author>周波</author><pubDate>Tue, 01 Aug 2006 14:14:00 GMT</pubDate><guid>http://www.cppblog.com/Jedimaster/archive/2006/08/01/10767.html</guid><wfw:comment>http://www.cppblog.com/Jedimaster/comments/10767.html</wfw:comment><comments>http://www.cppblog.com/Jedimaster/archive/2006/08/01/10767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jedimaster/comments/commentRss/10767.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jedimaster/services/trackbacks/10767.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: TheDirect3D 10 System																												注：SIGGRAPH2006即将在波士顿开幕，微软也将发布DirectX10的相关资料。为此特地翻译了源自微软DirectX开发社区的一篇PDF文档，“TheDirect3D 10System”，原文地址为http://download.microsoft.co...&nbsp;&nbsp;<a href='http://www.cppblog.com/Jedimaster/archive/2006/08/01/10767.html'>阅读全文</a><img src ="http://www.cppblog.com/Jedimaster/aggbug/10767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jedimaster/" target="_blank">周波</a> 2006-08-01 22:14 <a href="http://www.cppblog.com/Jedimaster/archive/2006/08/01/10767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>