小式
撐開一把寬大的油傘
你叫我回頭,再相擁一次
銅鐵鋪里午睡的老人
把父親的舊桶撂在檐下
籬笆灰墻,斜風矮窗
我會帶回紅豆的良種
土地就擁有血氣與生氣
忘記了歡唱的人們
無論多么卑微與庸碌
也會憧憬歡笑與善良
倘若你已經(jīng)幸福的離開
我會寄去花開的時節(jié)
填埋一半自己的墳冢。
相愛的孩子們會記得,
吻的香甜,與未成熟的苦澀
給你們,讓我感動過的人們。
我向往悲情的結(jié)束無人知,希望你可以理解我的心思,只在你一個人的身上,愛你,而無所求。
29日夜
posted @
2006-08-30 10:20 周波 閱讀(293) |
評論 (0) |
編輯 收藏
剛剛才把社會實踐報告搞定,幾千字的東西一點都不難了,上了大學才知道,原來吹噓和胡扯也是可以湊字數(shù)的,根本不像技術文章,深入淺出的字里行間才有價值。
這個七月和八月,對于家庭來說,是非常關鍵的兩個月,我經(jīng)歷了從父母失業(yè)的陰云到現(xiàn)在又平靜下來的漲落。于是乎我想了許多,這個世界本來就是充斥著隨機與概率的,好像少林足球中的那個涮盤子的師兄說,“為什么我老爸不是李嘉誠呢?”,我也有過這樣的想法,其實更加的濃烈,沒有好的條件,如何去和別人競爭,都不再一個起跑線上,沒有前人的經(jīng)驗,沒有引導,只有自己的一切。當然,自己能力強的人完全也可以達到相應的境界,只是太艱難,機遇也很微茫。這是事實,不是我的臆斷。但是,人們的大腦中如果充斥著“假設”“如果”這樣的字眼,那么將沒有任何的動力與那種強烈的欲望。人們的事情都一樣,無論是工作還是談戀愛,總不能說,如果我的老婆是某某該多好,如果我能一個人完成UNIX系統(tǒng)。
自小不喜歡競爭,只喜歡自己研究好玩的東西,自娛自樂的我,也許不適合那種高壓力的投入產(chǎn)出式的生活工作方式。我很佩服那個不領菲爾茲獎的俄羅斯人,無論怎么說,自己就是不喜歡和平常人在一起,搞研究也沒有所謂的軍事化進度,規(guī)模性效應,動輒幾百頁的篇目。他只是在網(wǎng)上發(fā)布了自己的幾頁手稿,也就是Frameworks的東西。從小也不喜歡說話,口吃是一個原因,更多情況時,覺得無話可說。星座上說是“強烈的羞恥感”,我想人人多多少少會有一些,也都有這樣的時刻,沒有充分被肯定前我是不會輕易的說出話。我則是將這樣的特點發(fā)揮得更加藝術,人家問我問題,無論是簡單的機器故障,還是朋友咨詢我買電腦的事情,從來我都是把我所知道的全部說出來,提供給別人,讓他們自己選擇。有人還說我是Google過來的,我只能說,你這個人,漠視獲取基本知識的能力。當然我也有自己的經(jīng)驗,不可能全部Google去。
暑假前面的日子都在搞那個RK引擎。嗯……26日前,我所有的Blog都是叫做“Rita's XXXX”,比如這個Blog以前叫做“Rita's Garden”,那個么,叫做“Rita's Kiss”。這簡直是一種信仰,我覺得是一種對待感情的最好方式。印象最深刻的一個上午,圖形引擎有了一些突破,那個時候氣溫37度,我還是沒有開空調(diào),光著膀子,跑到房間外邊的走廊上怪叫一聲,然后緊接著感覺兩眼昏花,因為沒吃早飯呵呵。現(xiàn)在看來,那是相當簡單的Trick,當我看過HF2引擎和ORGE引擎后,也知道了Shader程序應該如何與Fixed Functional程序整合。做到了快20號,終于發(fā)現(xiàn)有個最致命的缺點,渲染器承擔了太多的工作,甚至包括了Shading類和場景類,到了后來,無法作攝像機,無法作矩陣變換,無法作腳本計算。程序倒是有我的風格,簡單易用,就是太簡單了,沒有處理內(nèi)部邏輯。算是第一個C++失敗作品。后來Sigraphic 2006開幕了,Europgraphic也開幕了,我也徹底失去信心了,因為設計功底不夠,比工程還工程。
? 有些后悔暑假沒有出去玩,也沒有去參加語言培訓,法語荒廢了。我喜歡學習,那種感覺好極了,語言這種東西多學一些是有好處的,不僅僅是水平,也代表了一種新的思維方式。我就是挺喜歡法語的思路,形容詞后置,極端嚴格的語法,各種時態(tài)與情況,差不多覆蓋了所有的語言環(huán)境。德語也是,聽起來雖然說不好聽,也不押韻,單詞也變態(tài),簡直就是極端變態(tài)。不過還是挺有意思的。語言么,熟練出技術,脫口而說,現(xiàn)在聽德語歌占用了我90%的時間,剩下的是10%是英語。開學去上法語班吧,也沒有害處。英語不好說,雖然說平時看的所有技術書籍都是英文的,可是考試這種天殺的東西,還是有獨到的方式。用高三的班風靡的口頭禪來說,就是“寫”!
說起了高中,我希望用我的三年壽命換取高三能夠和她在一起的一個星期。那個晚上,沒有星光,城市里的高中,天色是暗紅的。每天晚自習一打下課鈴,我就跑到可以看到走廊的位置上,看著她和她朋友慢慢的從我們班門前走過,好漂亮的頭發(fā),和清澈無暇的瞳孔。可惜高中時刻不是我的,現(xiàn)在也不是,以后也難說。你猜對了,她就是Rita。我承認,我愛她,遠遠多于恨她,甚至都恨我自己,為什么要恨她。就這樣,暑假,15日她從長春回來,我不想去接她。18日走,我也不想送,不知道說什么,我也覺得非常尷尬。就是這樣的日子,讓我極端的疲憊。前幾天夜里說,她有男朋友了。今天傍晚,有個大線人,應該是偵查過了,說因為是她不知道如何拒絕。我簡直要給她氣死了,天蝎的女人,就是毒,而且還沒有任何可以捉摸的線索和表示,總之比測試Windows還要復雜。
Seele In Not,我的大學第一個暑假,一生中,還有最多兩個。拿起UML Distilled,明天去學校報到了,還要復習物理準備補考。
posted @
2006-08-28 19:57 周波 閱讀(304) |
評論 (0) |
編輯 收藏
小談
CPU
緩存體系
現(xiàn)在的
CPU
依舊采用馮諾伊曼體系,喜歡像傻子一樣從頭執(zhí)行到尾,中途沒有任何的跳轉(zhuǎn)停頓等待。可是現(xiàn)實情況是,大部分程序里面還是少不了
IF ELSE
之類的判斷,循環(huán)就更加得多了。如何優(yōu)化循環(huán)大家可以自己琢磨,其實不難,可以參考一下《高質(zhì)量
C\C++
編程指南》
現(xiàn)在
CPU
上都有
Level 1
指令緩存(又叫做
L1 Trace
)與
Level 1
數(shù)據(jù)緩存(
L1 Data Cache
)。
PMMX
,
P2
,
P3
為二者都準備了
16kb
,我的
P4 Northwood
(以下簡稱
P4NW
)有
8kbL1
數(shù)據(jù)緩存和
12kb
指令緩存。
CPU
讀取
L1 Data Cache
中的數(shù)據(jù)只需要
1
個時鐘周期,速度非常快,應該是僅次于寄存器了。數(shù)據(jù)緩存是由
256
或者
512
行
32bytes
組成的,也就是
32bytes
對齊的,而
P4NW
是
64bytes
字節(jié)對齊的,并行
4
路,總共
128
行。當你處理的數(shù)據(jù)沒有載入緩存的時候,
CPU
將從內(nèi)存讀取緩存行大小的數(shù)據(jù),所以緩存行總是對齊到能被
32
整除的物理地址。
CPU
對
L1
數(shù)據(jù)緩存中的數(shù)據(jù)進行操作是最快速的。所以推薦內(nèi)存地址最起碼是
32byte
對齊的。目前編譯器在這個地方的優(yōu)化已經(jīng)非常好了,一般都是
4byte
對齊,當然也都是
32
對齊的。在后面你將會看到,
SSE2
要求數(shù)據(jù)是
16
字節(jié)對齊的。
?
緩存類似一個
C++ set
容器,但是不能賦值到一個任意的內(nèi)存地址。每行本身都有
1
個
7bit
大小的關聯(lián)值(
set value
)要和目標內(nèi)存地址的
5
到
11
位對應(
0-4
位已經(jīng)忽略了),也可以理解為,關聯(lián)值是內(nèi)存段地址的一部分。
PPro
中,有
128
個關聯(lián)值對應到
2
行,所以最多可以為任意的內(nèi)存單元準備
2
個緩存行。
PMMX P2 P3 P4NW
有
4
個。由于內(nèi)存是分段的,所以說
CPU
只能為,
5-11
位地址相同的內(nèi)存準備
2
或者
4
個不同的緩存行。如何為兩個內(nèi)存地址賦予相同的關聯(lián)值呢?把
2
個地址的低
5bit
去掉,這樣就能被
32
整除了。如果這
2
個截斷了的地址都是
4096
(
1000H
)的倍數(shù),那么這兩個地址就有了相同的關聯(lián)值。
?
讓我們用匯編加深一下印象,假設
ESI
中是
32
對齊的地址。
?
??????????????????????????????????????? AGAIN:? MOV? EAX,? [ESI]
MOV? EBX,? [ESI+13*4096+4]
MOV ?ECX,? [ESI+20*4096+28]
DEC? ?EDX
JNZ ??AGAIN
Oh Year
,這里
3
個地址都有相同的關聯(lián)值,而且地址跨度都超過了數(shù)據(jù)緩存的大小,可這個循環(huán)在
PPro
上效率會相當?shù)汀.斈阆胱x取
ECX
的值的時候,將沒有空閑的緩存行了
——
因為共享一個關聯(lián)值,而且
2
行已經(jīng)被使用了。此時
CPU
將騰出最近使用的
2
個緩存行,一個已經(jīng)被
EAX
使用。然后
CPU
把這個緩存行用
[ESI+20*4096]
到
[ESI+20*4096+31]
的內(nèi)存數(shù)據(jù)填充,然后從緩存中讀取
ECX
。聽起來好象相當?shù)臒┈崱8釉愀獾氖牵斢中枰x取
EAX
的時候,還需要重復上述的過程,需要對內(nèi)存緩存來回操作,效率相當?shù)牡停踔敛蝗绮挥镁彺妗?墒牵绻覀儼训谌懈某桑?/span>
MOV? ECX,? [ESI+20*4096+32]
哦,不好,看起來,我們的地址超過了
32
,不能被整除了。可是這樣有了不同的關聯(lián)值,也就意味著有了
1
個新行,不再共享可憐的
2
個行。這樣一來,對三個寄存器的操作就不需要反復的用
2
個緩存行進行調(diào)度了,各有一個了。嘿嘿,這次只需要
3
個時鐘周期了,而上一個要
60
個周期。這是在
PPro
上的,在后來的
CPU
中都是
4
路的,也就不存在上面的問題了。搞笑的是,
Intel
的文檔卻錯誤的說
P2
的緩存是
2
路的。雖然說很少人在用那么古老的
CPU
,可是其中的道理大家應該明白。
可是判斷要訪問的部分數(shù)據(jù)是否有相同的關聯(lián)值,也就是關于緩存是否能夠命中的問題,是相當困難的,匯編還好,用高等級語言編譯過的程序鬼知道是否對緩存做過優(yōu)化呢。所以么,推薦,在程序的核心部分,對性能要求最高的部分,先對齊數(shù)據(jù),然后確保使用的單個數(shù)據(jù)塊不要超過緩存大小,
2
個數(shù)據(jù)塊,單個不要超過緩存大小的一半(仔細想想為什么,因為關聯(lián)值的問題,可以緩存分為兩部分處理兩塊)。可是大部分情況下,我們都是使用遠比數(shù)據(jù)緩存大的多的結(jié)構(gòu),以及編譯器自己返回的指針,然后為了優(yōu)化你可能希望把所有頻繁使用的變量放到一個連續(xù)的數(shù)據(jù)塊中以充分利用緩存。我們可以這樣做,把靜態(tài)變量數(shù)值拷貝到棧中的局部變量中,等子函數(shù)或者循環(huán)結(jié)束后再拷貝回來。這樣一來就相當于把靜態(tài)變量放入了連續(xù)的地址空間中去。
當讀取的數(shù)據(jù)不在
L1 Cache
內(nèi)時,
CPU
將要從
L2 Cache
讀取
L1
緩存行大小的數(shù)據(jù)到
L1
里去,大概需要
200ns
的時間(也就是
100Mhz
系統(tǒng)的
20
個時鐘周期),但是直到你能夠使用這些數(shù)據(jù)前,又需要有
50-100ns
的延遲。最糟糕的是,如果數(shù)據(jù)也不在
L2 Cache
中,那么就只能從最慢速的內(nèi)存里讀取了,內(nèi)存的龜速哪能和全速的緩存相比。
好了,關于緩存的知識可以就此打住了,下面開始講如何優(yōu)化緩存。無非就是
3
種方法,硬件預取(
Prefetch
)、軟件預取、使用緩存指令。關于預取的注意事項主要有這些:
<!--[if !supportLists]--> 1、? <!--[endif]--> 合理安排內(nèi)存的數(shù)據(jù),使用塊結(jié)構(gòu),提高緩存命中率。
<!--[if !supportLists]--> 2、? <!--[endif]--> 使用編譯器提供的預取指令。比如ICC中的_mm_prefetch _mm_stream,甚至_mm_load等比較“傳統(tǒng)”的指令。
<!--[if !supportLists]--> 3、? <!--[endif]--> 盡可能少的使用全局的變量或者指針。
<!--[if !supportLists]--> 4、? <!--[endif]--> 程序盡可能少的進行判斷跳轉(zhuǎn)循環(huán)。
<!--[if !supportLists]--> 5、? <!--[endif]--> 使用const標記,不要在代碼中混合register聲明。
不過要提醒一句,真正提高程序效率的方法不是那種,從頭到尾由于外科手術般的解剖,一個一個地方的優(yōu)化,請抓住程序最核心的部分進行優(yōu)化,記住
80-20
規(guī)則。
?
使用
SIMD
先復習一下對齊指令,
__declspec(aliagn(#))
,
#
替換為字節(jié)數(shù)。比如想聲明一個
16
字結(jié)對齊的浮點數(shù)組,
__declspec(aliagn(16)) float Array[128]
。需要注意的是,最好充分了解你
CPU
的類型,支持哪些指令集。
SIMD
主要使用在需要同時操作大量數(shù)據(jù)的工作領域,比如
3D
圖形處理(游戲),物理建模(
CAD
),加密,以及科學計算領域。據(jù)我所知,目前
GPGPU
也是使用
SIMD
的代表之一。
MMX
主要特性:
57
條指令,
64bit
的
FP
寄存器
MM0-MM7
,對齊到
8
個
80bit
的
FP
寄存器
ST0-ST7
。需要數(shù)據(jù)
8
字節(jié)對齊,也就是使用
Packed
數(shù)字。
PS
:這里冒出了一個問題,為什么
Intel
要把
MMX
的寄存器和
FPU
的寄存器混合起來使用呢?因為這里牽涉到一個
FPU
狀態(tài)切換問題,后面會提到,當你在一段代碼中又要用到
MMX
指令又要用到傳統(tǒng)的
FPU
指令,那么需要保存
FPU
狀態(tài),或者退出
MMX
。可是這種操作對于
FPU
來說非常昂貴,而且對于多任務操作系統(tǒng)來說,近乎于不可能完成的任務
——
同時有許多程序,有些需要
MMX
,有些不需要,而正確地進行調(diào)度會變得非常困難。所以
Intel
將保存狀態(tài)的工作完全交給了
CPU
自己,軟件人員無須作太多這方面的工作,這樣一來,就向前向后兼容了多任務操作系統(tǒng),比如
Windows
和
Linux
。后來隨著操作系統(tǒng)和
CPU
的不斷升級,操作系統(tǒng)開發(fā)人員發(fā)布了一個補丁包,就可以讓操作系統(tǒng)使用新的寄存器。這時人們都發(fā)現(xiàn)
Intel
的這種做法是相當短視的,這可以當作一個重大的失誤。后來
Intel
通過引入了新的浮點指令集,這時才加入
XMM
寄存器。可造成這段故事的原因卻根本不是技術問題,保證兼容性也是一個方面,總之真的說不清楚。你只要記得無法同時使用
MMX
與
FPU
就可以了,
CPU
要進行模式切換。
SSE1
主要特性:
128bit
的
FP
寄存器
XMM0-XMM7
。增加了數(shù)據(jù)預取指令。額外的
64bit
整數(shù)支持。支持同時處理
4
個單精度浮點數(shù),也就是
C\C++
里的
float
。
適用范圍:多媒體信號處理
SSE2
主要特性:
128bit
的
FP
寄存器支持處理同時處理
2
個雙精度
double
浮點數(shù),以及
16byte 8word 4dword 2quadword
整數(shù)。
適用范圍:
3D
處理
語音識別
視頻編碼解碼
SSE3
主要特性:增加支持非對稱
asymmetric
和水平
horizontal
計算的
SIMD
指令。為
SIMD
提供了一條特殊的寄存器
load
指令。線程同步指令。
適用范圍:科學計算
多線程程序
手頭工具
1
、選擇一個合適的編譯器,推薦用
Intel C++ Compiler
(以下簡稱
ICC
),以及
Visual Studio .NET 2003
及以上
IDE
附帶的
C++
編譯器。同時,
Microsoft C++ Compiler
也支持
AMD
的
3DNow
。
GCC C++ Compiler
沒有測試。
2
、
Intel
以及
AMD
的匯編指令集手冊。這個是必需的,強烈建議每個C++ Coder人手準備一份。
?
所有的都用
C++
混合變成的方式實現(xiàn)
使用范例:
向量乘法在
3D
處理中非常非常多,多半用于計算單位矢量的夾角。
我們先定義一個頂點結(jié)構(gòu)。
__declspec(align(
16
))?
struct
?Vertex{
????
float
?x,y,z,w;
};
??? 16字節(jié)對齊的結(jié)構(gòu),其實本身也是16字節(jié)的東西。如果沒有對齊,運行時會報錯。
w是其次坐標系的參數(shù),處理向量的時候不需要用到。我的函數(shù)是這樣的:
float?Dot(Vertex*?v1,Vertex*?v2)
{
????Vertex?tmp;
????__asm{
????????MOV?EAX,[v1];
????????MOVAPS?XMM0,[EAX];
????????MOV?EAX,[v2];
????????MOVAPS?XMM1,[EAX];
????????MULPS?XMM0,XMM1;
????????MOVAPS?tmp,XMM0;
????};
????return?tmp.x?+?tmp.y?+?tmp.z;
};
??? VC中反匯編之:
?1?float?Dot(Vertex*?v1,Vertex*?v2)
?2?{
?3?0041C690??push????????ebx??
?4?0041C691??mov?????????ebx,esp?
?5?0041C693??sub?????????esp,8?
?6?0041C696??and?????????esp,0FFFFFFF0h?
?7?0041C699??add?????????esp,4?
?8?0041C69C??push????????ebp??
?9?0041C69D??mov?????????ebp,dword?ptr?[ebx+4]?
10?0041C6A0??mov?????????dword?ptr?[esp+4],ebp?
11?0041C6A4??mov?????????ebp,esp?
12?0041C6A6??sub?????????esp,0E8h?
13?0041C6AC??push????????esi??
14?0041C6AD??push????????edi??
15?0041C6AE??lea?????????edi,[ebp-0E8h]?
16?0041C6B4??mov?????????ecx,3Ah?
17?0041C6B9??mov?????????eax,0CCCCCCCCh?
18?0041C6BE??rep?stos????dword?ptr?[edi]?
19?????Vertex?tmp;
20?????__asm{
21?????????MOV?EAX,[v1];
22?0041C6C0??mov?????????eax,dword?ptr?[v1]?
23?????????MOVAPS?XMM0,[EAX];
24?0041C6C3??movaps??????xmm0,xmmword?ptr?[eax]?
25?????????MOV?EAX,[v2];
26?0041C6C6??mov?????????eax,dword?ptr?[v2]?
27?????????MOVAPS?XMM1,[EAX];
28?0041C6C9??movaps??????xmm1,xmmword?ptr?[eax]?
29?????????MULPS?XMM0,XMM1;
30?0041C6CC??mulps???????xmm0,xmm1?
31?????????MOVAPS?tmp,XMM0;
32?0041C6CF??movaps??????xmmword?ptr?[tmp],xmm0?
33?????};
34?????return?tmp.x?+?tmp.y?+?tmp.z;
35?0041C6D3??fld?????????dword?ptr?[tmp]?
36?0041C6D6??fadd????????dword?ptr?[ebp-1Ch]?
37?0041C6D9??fadd????????dword?ptr?[ebp-18h]?
38?};
??? 前面都是保護現(xiàn)場入Stack的代碼,沒有必要管。我之所以這樣,在Stack中聲明了一個零時變量返回之,是為了減少代碼的行數(shù)。有興趣地可以參考本文后面引用資料中的Intel范例,代碼多的多,功能卻一樣。這樣就可以利用SIMD計算點乘了。圖示:
??? 這種頂點格式稱為AoS(Array of structure),這種結(jié)構(gòu)的好處是,能夠和現(xiàn)有的程序結(jié)構(gòu),比如D3D中的FVF頂點格式,和GL中的頂點格式。但是,由于許多情況下,并沒有使用第四各浮點數(shù),這就讓SIMD指令浪費了25%的性能。于是有了SoA格式,讓我們重新來過。
??? 我借用了一下上面一個結(jié)構(gòu)的指令,還是沒有用_mm_128格式,讓大家看得清楚一些:
__declspec(align(16))?struct?Vertex_soa{
?????float?x[4],y[4],z[4],w[4];
};
??? 依舊16字節(jié)對齊。計算函數(shù)如下:
?1?void?Dot(Vertex_soa*?v1,Vertex*?v2,float*?result)
?2?{
?3?????Vertex?tmp1,tmp2;
?4?????__asm{
?5?????????MOV?ECX,v1;
?6?????????MOV?EDX,v2;
?7?
?8?????????MOVAPS?XMM7,[ECX];
?9?????????MOVAPS?XMM6,[ECX+16];
10?????????MOVAPS?XMM5,[ECX+32];
11?????????MOVAPS?XMM4,[ECX+48];
12?????????MOVAPS?XMM0,XMM7;
13?????????UNPCKLPS?XMM7,XMM6;
14?????????MOVLPS?[EDX],XMM7;
15?????????MOVHPS?[EDX+16],XMM7;
16?????????UNPCKHPS?XMM0,XMM6;
17?????????MOVLPS?[EDX+32],XMM0;
18?????????MOVHPS?[EDX+48],XMM0;
19?
20?????????MOVAPS?XMM0,XMM5;
21?????????UNPCKLPS?XMM5,XMM4;
22?????????UNPCKHPS?XMM0,XMM4;
23?????????MOVLPS?[EDX+8],XMM5;
24?????????MOVHPS?[EDX+24],XMM5;
25?????????MOVLPS?[EDX+40],XMM0;
26?????????MOVHPS?[EDX+56],XMM0;
27?
28?????????MOVAPS?XMM3,[EDX];
29?????????MOVAPS?XMM2,[EDX+16];
30?????????MOVAPS?XMM1,[EDX+32];
31?????????MOVAPS?XMM0,[EDX+48];
32?
33?????????MULPS?XMM3,XMM2;
34?????????MULPS?XMM1,XMM0;
35?????????MOVAPS?tmp2,XMM1;
36?????????MOVAPS?tmp1,XMM3;
37?????};
38?????result[0]?=?tmp1.x?+?tmp1.y?+?tmp1.z;
39?????result[1]?=?tmp2.x?+?tmp2.y?+?tmp2.z;
40?};
??? Oh Yeah,就是這樣了,同時計算了1對乘法。我在代碼中借用了一下前面的頂點結(jié)構(gòu),這樣方便一些。至于SOA格式,請看前面的聲明。很多代碼都是轉(zhuǎn)換Stack中的內(nèi)存格式,轉(zhuǎn)換成AOS格式,這樣才能使用SIMD指令計算。
??? 通過上面的演示,想必大家已經(jīng)對SIMD有了個直觀地認識,其實在自己的代碼中加入這些是非常方便與容易的。雖然說現(xiàn)在的CPU性能已經(jīng)提高了許多,性能也強了許多,可是在諸多對性能要求高的地方,還是非常烤煙程序員的水平的。
???
歡迎大家拍磚!
posted @
2006-08-24 15:37 周波 閱讀(3484) |
評論 (2) |
編輯 收藏
為了以后優(yōu)化算法,還是硬著頭皮學了一下匯編,也就是C\C++與匯編的混合編程,帖一個類的代碼,非常簡單的東西,覺得還可以優(yōu)化。識別CPU的型號,使用了Intel的CPUID指令,還沒有來得及看AMD的資料,以后有空了我也做一個類似于CPUID一樣的小工具呵呵。
class?CIntelCpuInfo{
private:
????DWORD?m_VersionInfo;
????DWORD?m_Features;
????
????void?GetFeatures();
????void?GetVersionInfo();
public:
????CIntelCpuInfo()?{};
????~CIntelCpuInfo()?{};
????void?Show();
};
void?CIntelCpuInfo::Show()
{
????this->GetVersionInfo();
????this->GetFeatures();
};
void?CIntelCpuInfo::GetVersionInfo()
{
????DWORD?VER;
????DWORD?BACKUP;
????DWORD?STEP,MODEL,FAMILY;
????__asm{
????????MOV?EAX,01H;
????????CPUID;
????????MOV?VER,EAX;
????????MOV?BACKUP,EAX;
????????AND?EAX,0000000FH;
????????MOV?STEP,EAX;
????????MOV?EAX,BACKUP;
????????SHR?EAX,4;
????????AND?EAX,0000000FH;
????????MOV?MODEL,EAX;
????????MOV?EAX,BACKUP;
????????SHR?EAX,8;
????????AND?EAX,0000000FH;
????????MOV?FAMILY,EAX;
????};
????cout<<"Family?ID?:?"<<FAMILY<<"?Stepping?ID?:?"<<STEP<<"?Model?:?"<<MODEL<<endl;
};
void?CIntelCpuInfo::GetFeatures()
{
????DWORD?C,D;
????DWORD?SSE3Tag;
????DWORD?SSTEPTag;
????DWORD?SSE2Tag;
????DWORD?SSE1Tag;
????DWORD?MMXTag;
????__asm{
????????MOV?EAX,01H;
????????CPUID;
????????MOV?C,ECX;
????????PUSH?ECX;
????????AND?ECX,01H;
????????MOV?SSE3Tag,ECX;
????????POP?ECX;
??????? AND?ECX,0080H;
????????MOV?SSTEPTag,ECX;
????????SHR?SSTEPTag,7;
????????MOV?D,EDX;
????????SHR?EDX,23;
????????PUSH?EDX;
????????PUSH?EDX;
????????AND?EDX,01H;
????????MOV?MMXTag,EDX;
????????POP?EDX;
????????SHR?EDX,2;
????????AND?EDX,01H;
????????MOV?SSE1Tag,EDX;
????????POP?EDX;
????????SHR?EDX,3;
????????AND?EDX,01H;
????????MOV?SSE2Tag,EDX;
????};
????cout<<"SSE3?Support???"<<SSE3Tag<<endl;
????cout<<"SSE2?Support???"<<SSE2Tag<<endl;
????cout<<"SSE1?Support???"<<SSE1Tag<<endl;
????cout<<"Enhanced?SpeedStepping???"<<SSTEPTag<<endl;
};
我的CPU是2002年下半年的,Intel Pentium 4 Northwood 1.8GA,嗬嗬,搞得多么先進一樣。截圖如下,

結(jié)果完全正確。有了一些經(jīng)驗,在以后的程序中,可以通過識別CPU類型進行額外的優(yōu)化,以后好好的研究Intel的Manual。
posted @
2006-08-18 22:15 周波 閱讀(1000) |
評論 (1) |
編輯 收藏
??? 是黑暗的年代就會有英雄出現(xiàn)。他們在廢棄的管道中來回跳躍,熟悉這個世界上任何槍械的使用,不過更多的時候他們不屑使用熱兵器。他們也是當局最為頭痛的家伙,倒不是他們的武藝高超,更多的原因是,他們政治觀點的完完全全的與自己所推行的背道而馳。可是往往就是這些人,才能給在水深火熱里面掙扎生活的民眾一絲希望,與活下去的勇氣。有這樣的風云人物出現(xiàn),是不幸,也是萬幸。
??? 蘇特勒的“北方野火”代替保守黨上臺,清洗異己,強力打造政權(quán)符號,黑底紅十字。動用平民研制生化武器,對美國的戰(zhàn)爭不聞不問。于是乎,造就了V怪客這個變種。V怪客殺一個人,就會留下一支玫瑰,還有一個鮮紅的V字。黨員們每次執(zhí)行公務,都會把黨徽昭示于眾,好像我們的一些人,總會把自己的身份掛在嘴邊。人們畏懼,膽戰(zhàn)心驚的存活。無休止的宵禁,黑夜里無休止的恐懼。
??? 最近與一個家境頗好的同學在版上討論關于一個鼓樓老太10年賣報積攢10萬準備買房的事情,不管什么,人家拋出“我只要我自己過得好,別人的死活與我無關”的話,我頓時無話可說,因為我太詫異于我們85年后這一代的想法已經(jīng)進化到如此地步。正如一個人的出生階級反映了成長環(huán)境,以及日后的成就。國家也一樣,成吉思汗,一介武夫,帝國分崩離析;法國大革命,吉特倫派,雅格賓派,熱月黨,最后竟然等來了拿破侖。
??? 國家的精神總是在各種容易達成廣泛契合的類型中間尋找自己的實在形體,其中的艱辛與過程只有執(zhí)行者才能深刻的體會到。這一點倒有些類似于談戀愛,總有自己不適合的,與不屬于自己的。正如美國憲法起草的過程一般,各種私利所想與公共所趨走到一起尋求妥協(xié)。但是當國家精神以條文、體制的方式——我稱之為政權(quán)符號加以體現(xiàn)出來的時候,發(fā)展的趨勢將由政府的決策方式進行解釋。民眾在塑造個人自己心中的國家精神,一般無法考慮,只能從全局的行為模式進行觀測。好比沒有人說德國人從來不闖紅燈,不過都知道德國人極為嚴謹細致一樣。反過來說,國家作為地域性組織的高級形式,其職責必須被道德感約束,而且必須將其行為集合公布于眾——設立軍隊警察法庭監(jiān)獄議會。
??? V怪客的刀劍與玫瑰讓首腦膽戰(zhàn)心驚,不顧一切的想抓住他。可是V怪客總能出其不意的如同幽靈一般出現(xiàn),讓目標沒有痛苦的死去,放上玫瑰,等待黨員們收尸,繼續(xù)通緝。自己在自己的城堡里仰望這個古老城市的生命,在暴風驟雨下沉睡,滋長,享受真黃油煎的雞蛋,賞閱著滿墻的違禁藝術品,代價是自己的面具,到死都沒有人看到自己的真面目。
??? 政權(quán)符號應當是人們心中的第一印象,也將會混雜著各種來自個人的不成熟視點。正如一個社會的既得利益團體與貧苦的受剝削人群之間的沖突,V怪客們也會將自己的意志強加給那些頭頭腦腦們,無非也就是暗殺煽動等等。當既得利益團體受到威脅的時候,他們求助于強化政權(quán)符號在大眾心中的孤立感與強硬感 —— 沒錯,孤立。進化過的高級社會,成員與政權(quán)之間將不僅僅存在于,“我今天打獵捕獲了一頭牛,可是我從酋長那里到了一點點牛尾巴”這樣的關系,而更多的關聯(lián)會在個人生活的方方面面中得到強化,因為無論在在何種環(huán)境中發(fā)展,國家組織只會變得越來越強勢與暴戾。
??? 可是無論怎樣,民眾的需求都是建立在自己的生活基礎上的,只要可以有可以糊口的工作,有一處棲身之所,也有一些所謂的政治權(quán)利——無論是有用還是無用的,就都可以生存下來。可是,想要在這種近似簡化為供求的關系中尋找正義或者公義是相當相當困難的,因為這樣如同沒有任何思考就進行交易,從不計較利益得失與真正的需求。或者說,在這樣不斷強調(diào)個人空間與行為自由的社會中,人們的心智將更加容易的被誤導與曲解,也不會對這種伸出手式的動作作出多么深刻的思考。政權(quán)符號此時退化為既得利益團體的救命稻草,剝削群體的咒罵對象,與暴民的發(fā)泄對象。
??? 暴民從來就不是綠林好漢,那種無畏的破壞供求關系與社會心理的行徑往往只能適得其反,而且大多數(shù)綠林好漢從來都不會開倉濟民,往往也是自己做了土皇帝。暴民也不是小說中出生入死殺人無數(shù)的神槍手,往往一介武夫還是要受制于所處的形勢。暴民應該是,理解民眾的需求,知曉如何重塑民眾的信心,洞悉當下的薄弱點,最好,也是如何用最少的武力消滅無恥之徒的,普通民眾。
posted @
2006-08-17 15:26 周波 閱讀(636) |
評論 (6) |
編輯 收藏
?

今天像往常一樣打開eMule 0.47a,從sf.net上下載的干凈版本,可不是veryCD那種垃圾修改版本。eMule目前文件數(shù)目最多用戶最多的是德國DonkeyServer服務器群。veryCD以前很不錯,但是廣告也越來越多了起來,更重要的,它發(fā)布的eMule版本是用得最多的。好多次向朋友推薦sf.net上的原版eMule,可是他們不知道安裝的時候沒有簡體中文,安裝好了后可以選簡體中文的。現(xiàn)在可好,當那些豬腦Web投資商不顧一切的將這種流氓行為推廣到互聯(lián)網(wǎng)的時候,在互聯(lián)網(wǎng)上,中國P2P用戶的臉面何在?當他驚恐的發(fā)現(xiàn)沒有人再下載客戶端為他的廣告買單的時候,中國的用戶將無法得益于P2P軟件。強烈建議流氓軟件名單中加入VeryCD的eMule。
為了以后的eMule,可以正常使用,請到sourceforge.net
下載官方干凈版本。
posted @
2006-08-17 09:44 周波 閱讀(1886) |
評論 (5) |
編輯 收藏
2006年3月 雪城
??? 雪片落在的城頭,
??? 已經(jīng)四月。
??? 好像流浪的人們,
??? 在教堂外支起破碎的篷帳。
??? 故鄉(xiāng)的梅花開了,
??? 你沒有機會看上一眼。
??? 雪城的女兒笑了,
??? 她向往過自由,熱情,大海。
??? 我重新翻出抄本,油燈,
??? 窗臺的詩叢又發(fā)了芽:
??? 它們?yōu)橐蝗苏蹟?
??? 它們?yōu)橐蝗丝莞伞?/p>
??? 城里沒有眼眶的雕塑,
??? 立在處決記憶的刑場上。
??? 它的胸中燃燒過篝火,
??? 卻沒有一位會拉琴的父親。
??? 它沒有看見我,
??? 因為恐懼我的刀劍;
??? 她也沒有看見我,
??? 我蒙住了你鏡中的雙眼。
?
posted @
2006-08-10 21:43 周波 閱讀(233) |
評論 (0) |
編輯 收藏
- 結(jié)構(gòu)冗繁。尚不說安裝一個普通的LINUX發(fā)行版需要多少包,就是包和包之間的依賴關系,可是比理順腸子還困難一百倍。最討厭看到的就是在命令行下興沖沖的輸入安裝命令時跳出一個個require提示,得!插入碟一個一個安裝吧。
- 體積龐大。WINDOWS98多大?全部安裝600M;2000多大?普通安裝1.3G;XP多大?普通安裝2.1G;VISTA還不知道。反正我知道SUSE已經(jīng)用DVD裝載了。這一點比M$先進!可是硬盤空間呢?是否系統(tǒng)真的需要那么多的東西么?非也
- 工具花哨不統(tǒng)一。我知道LINUX FANS的水平很高,可是就是沒有M$出的軟件那么順手實用,就拿播放器來說,各式各樣的東西,從KDE自己的MP3播放器開始,到仿造WINAMP的播放器,還有各種CD播放器。WINDOWS下就是方便多了,ASPI+EAC可以搞定所有的CD抓取工作,foobar2000+Media Player Classic,搞定了音頻視頻。即使是對大多數(shù)人來說,也有諸如WMP,PowerDVD等對于入門用戶也非常有親和力的軟件。這種高手充其量也是普通的Hacker,不是Engineer,更不是Professinal Developer。
- 基礎教育沒有普及。好象還沒有人給大多數(shù)入門者解釋過X-WINDOWS是什么東西,當初我是花了不少時間才弄明白X11R6 XFree86 XServer等等就是是什么東西,然后才會安裝NVIDIA的驅(qū)動程序,手動更改配置文件。也沒有人解釋過,當初人們?nèi)绾斡妹钚性L問http,訪問NFS,大多數(shù)會用WINDOWS下的“網(wǎng)上鄰居”,“CuteFTP”。如果想要推廣LINUX,學校這一關不可忽視。可是……
- 需要最起碼讓所有的人都要明白C\C++語言是怎么回事。想升級系統(tǒng),先拿內(nèi)核開刀。可是這個內(nèi)核究竟是什么東西,為什么要編譯?為什么編譯時需要用到一個叫做makefile的東西?一切的一切,對于普通人來說,可是非常陡峭的學習曲線。
- 開發(fā)人員沒有一個完整強大的C\C++ IDE。IDE,最基本的功能莫過于工程管理和代碼提示。Borland造了一個,那是為了Delphi,可是C\C++人員呢?難道還是vim敲字符?手動make?
- 驅(qū)動程序規(guī)范不統(tǒng)一。有的驅(qū)動程序要求重新編譯內(nèi)核,以及各種各樣的安裝方式。3D是最要命的,除了NVIDIA積極外,其他的廠商看不出什么動作。還有3D API,純軟件跨平臺的Mesa3D,還有一個GLX。
posted @
2006-08-10 21:25 周波 閱讀(333) |
評論 (1) |
編輯 收藏
這幾天忙著找兼職,可是人家一聽我是大二的,都不要了
干脆再修煉修練內(nèi)功吧,研究研究Dx10。大三空閑多了出去找工作。
哪怕清潔工什么的我都愿意干,沒辦法,生活所迫。
女朋友還是不要了,浪費錢。
晚上發(fā)信息,還是那句“真的感謝你可以坐我的朋友,你實在太好了,可是我不會輕易和自己妥協(xié)的”
得!這種死戀比打仗還痛苦。
posted @
2006-08-08 11:54 周波 閱讀(711) |
評論 (6) |
編輯 收藏
在CSDN上面發(fā)表過,可惜沒有什么多大的反響。看來我寫完算了。
MSN上一直有個昵稱是日語寫的人,而且能看得懂,是長槍的名。而且,聊天從來都是用繁體中文,開始我還以為他是個香港人還是臺灣人。后來才知道,他就是個上海人,不過去日本做的軟件,學的日語,也真正的體會到了日本和風的真正韻味。
日本的孩子,從小就被教育為要成為“日本男兒”,而且很多民歌童謠里面也都是這樣。所以說,日本的小男孩從小煉空手道劍道是非常平常的事情。而在我們的國
家里面,稍微富裕的城市家庭里面,孩子大多學習琴棋書畫,或者就是在網(wǎng)吧游戲機房里面消磨時間。在他的眼里,男人就要求能夠努力工作,還要能打,也就是身
體好。在日本人眼里,男孩也就是要從小鍛煉好身體,上為國家社稷,下為自己的生活努力拼搏。所以日本人的企業(yè),尤其是像IT行業(yè)里從來就沒有提倡歐美式,
一個天才包攬所有,而是強調(diào)每個人都如同螞蟻一樣,為了整個集體,拼命的學習,拼命的工作,絕對的服從,沒有任何反對的機會。聽起來好像很殘酷,可是只有
親身體會過的人才有那種感觸。這個就像老早以前的我們國家,那種下班后依舊不想回家,還要求找些事情做的那種質(zhì)樸的感情。所以說,日本在戰(zhàn)后可以迅速崛
起,與德國人出了名的古板和嚴謹有異曲同工之處。如果社會上的男人——恕我直言,現(xiàn)在依舊是個男權(quán)社會,以后也依舊會是,這個世界的財富大部分還是由男人
取得,無論職位高低貴賤,從最原始的搬運工,到所謂的高級領導人,大部分真正能夠創(chuàng)造價值的職位還是由男人掌握的。如果社會上的男人都如同螞蟻一樣,刻苦
的學習與努力工作,那么,一個國家豈有不崛起之理?相反,如果人們懶惰,不思進取,不能分辨真假好壞,就會任由小部分別有用心的人物牽著鼻子走。一個社會
究竟如何的具有生命力,看看它的民眾的精神狀態(tài)與追求就可以了,如果一個社會造就的人們,天天想著如何去走相對省力氣的捷徑,如何去費盡心機的拆別人墻肥
自己,如何的耍小聰明。這點在國外,我想每個人都有所感觸。
說一些實際的,對普通人胃口的,比如找女孩子來說,日本大部分都是女孩子追男孩子。情人節(jié)都是女孩子送男孩子巧克力。可以理解,在那種男權(quán)社會,社會分
工,家庭分工極為明確。男人只需要努力掙錢養(yǎng)活全家老小,女人就在家里做男人的后勤工作。說到這里,女權(quán)主義者又要跳上桌子,揮舞起自由主義的大旗,嚷嚷
什么女人也有自尊,不能靠男人養(yǎng)著。這是廢話,在哪里不都一樣,又沒有明文規(guī)定女人不可以工作,女人只能靠男人養(yǎng)著,可惜偏偏只有只有身邊八十年代后的大
部分女人才會這樣做寄生蟲,這樣的不顧一切的在網(wǎng)上牛鬼蛇神一樣的瘋狂脫衣,瘋狂賣丑,瘋狂自慰——自我安慰。一次在公交車上,一個行為極為做作的女孩在
電話里大言不慚地說,“你究竟怎么養(yǎng)我啊!”。我想,那個男人也是個,賤貨,這種女人都追求的話,這片土地上就不會有任何女孩出現(xiàn)了。好像總會冒出來上海
女人瘋狂的追求外國男人的事情,哪怕窮得叮當響,在中國,那些女人是覺得中國男人弱,沒自尊,點破一點,沒有辦法滿足自己的劣種追求。可是來中國追求中國
男人的日本女人,恰恰就是看中了中國男人的弱,日本男人那種要強與瘋狂競爭讓他們受不了。不知道這是對中國男人的羞辱還是什么,反正我覺得挺難受的。
正如中國諸多淫民朝思暮想的那樣,在電車上做哪些猥瑣的事情。日本人管這些叫做“癡漢”,繁體字也就是這個。日本電車非常非常的擁擠,而且更重要的是,日本女人穿著非常暴露,反正就是遠比中國所謂的時尚女人暴露。不過值得注意的是,好像大部分癡漢都是大學畢業(yè)生,沒有工作,只能成為類似于中國盲流一樣的人。為此日本電車有專門的女子車廂,為此還有民間組織團體抵制這種制度,因為“癡漢”畢竟是少數(shù),不能這樣把所有的男人一棍子打死。不過在這里,我也是大學生,即將大二。細細想起來,不如不去上學,在家里自學取得知識都要,可是文憑歧視又無法避免,又需要為這一紙文憑消耗4年時間。成為盲流固然心痛,可是都是生活。曾經(jīng)看過《程序員》關于去日本工作的開發(fā)人員的報道,還有近幾年無數(shù)上海公司成為對日外包的情況,不曾經(jīng)注意過日本這么多的情況。
印象中的日本是個很普通的國家,歷史上沒事也喜歡搞搞霸權(quán)侵略什么的。從明朝就開始了,日本的安土桃山時代。說到這里小糞糞又要跳出來指責,不妨攤開歷史書,歷史上中國土地上的朝代對周圍的國家怎么樣了?還不是希望占為己有,開疆辟野。保家衛(wèi)國是一回事,可是純粹為了所謂的安危去四處征討也絕對不在少數(shù)。可是為什么舊時代的日本與大清國一樣的腐朽破敗,可是為什么卻可以在日俄戰(zhàn)爭中擊潰俄國?為什么能在甲午戰(zhàn)爭中擊潰清兵?二戰(zhàn)后,日本又與中國一樣,廢墟瓦立,經(jīng)濟即將崩潰,可是他們又崛起了,崛起的更高,連親手栽培的美國人都怕了。現(xiàn)在,總體上來說是文明時代,各個國家主要還是以發(fā)展經(jīng)濟,培養(yǎng)法制社會秩序,富裕勞動人民為最重要的使命。為什么小泉總是改不了去靖國神社參拜,國內(nèi)的右翼組織的強大是最主要的原因。自古日本就有“公武雙治”的說法,幕府將軍和公家朝廷總是對峙著的。現(xiàn)在也一樣,無非是傳統(tǒng)的尊皇派與政府派之間的對峙。
做技術的人,看問題一般都比純粹搞什么“社會問題”的人看問題要清晰的多。正如一個人無法選擇他的出生,卻可以改變它的命運;可以無法選擇被哪個政權(quán)奴役,卻可以選擇心歸何方。等生活了不少年,也會發(fā)現(xiàn)年輕時嚷嚷著“糞斗”實在是愚蠢至極的方法。只要有一個地方,符合一個人的生活觀念,與周圍的大部分人都抵觸,在這里那么肯定將成為眾矢之的。好像周圍的同學有許多高考沒有考好,準備出國的。總之,尊重別人的理想,比自己去拚命的詆毀別人來的,成熟的多,也有益的多,畢竟,自己的這一生的價值才是最重要的。
posted @
2006-08-03 10:40 周波 閱讀(267) |
評論 (0) |
編輯 收藏