![]() |
||
|
*停權中*
加入日期: Apr 2001 您的住址: 香港
文章: 1,441
|
引用:
沒有人說要把spin-lock程式碼改成monitor/mwait的形式執行 而是相反,把monitor/mwait程式碼改成spin-lock的形式執行 這樣開發商只需要為P4寫一次程式碼就可以直接拿到K8執行 當然也可以用你的方法,但就必須修改程式碼了 相對於開發商來說未必是好事,因為開發時間會長了,多一個選擇給他們並不是壞事 |
||||||||
|
|
|
New Member
加入日期: Jan 2005
文章: 6
|
引用:
你看起來沒有了解我的意思,讓我說具體一點好了。 你好像以為spin-lock是硬體技術,但事實上它不過就是個迴圈。 傳統SMP的spin-lock是長這樣 代碼:
while(1){
while(lock_var);
EAX = 1;
swap(lock_var, EAX);
if(EAX == 0) break;
}
// critical section goes here...
有了monitor/mwait指令後變成這樣 代碼:
while(1){
while(lock_var){
monitor lock_var;
if(lock_var != 0){
mwait;
}
}
EAX = 1;
swap(lock_var, EAX);
if(EAX == 1) break;
}
// critical section goes here...
雖然你強調「只需要為P4寫一次程式碼就可以直接拿到K8執行」,但就算在P4上,這兩種程式碼還是需要並存,因為前者適用SMP/dual-core,後者適用hyperthreading。而判斷應該使用前者或後者的責任則在OS身上,所謂「開發廠商」並不用管這件事,也不需要為了dual-core K8寫一份新的code,他們只要用OS提供的system call,給hypterthreading P4用的程式也可以在dual-core K8上跑得很愉快。 |
|||
|
|
|
Power Member
![]() ![]() 加入日期: Feb 2005 您的住址: 葫蘆墩
文章: 561
|
|
|
|
|
*停權中*
加入日期: Apr 2001 您的住址: 香港
文章: 1,441
|
引用:
上面的寫法已經把兩種指令包括在內,若可以使用spin-lock就使用spin-lock 不行就使用monitor/mwait去做相同的工作 似乎Intel寫SSE3時有考慮到這點,那我推翻自己的說法 |
|
|
|
|
Major Member
![]() 加入日期: Sep 2004 您的住址: 木柵動物園
文章: 293
|
引用:
不過以目前的 OS 都是用 C 來 implement 的,像 windows NT kernel (4.0/5.0),spinlock 會被 OS 與 driver 呼叫,但是我想實際 implement 方式會隨 cpu 不同,而呼叫最佳化 function,如果是 p4 可以使用 monitor/mwait 最佳化程式碼,而 k7/k8/p3/p-m 則用傳統的 busy waiting。 而 application 的 synchronization API 因為是 system call,也是可依照 cpu 來最佳化,即使是在 unix 下,用 user level thread 來 implement,也是可以修改動態聯結庫 (.so) 來最佳化,而不用修改應用程式。 另外 SSE3 應該不是針對 P4 的 HT 而作的設計,SSE3 是 SIMD 或稱 vector 指令集,只對某些可以大量平行運算的浮點運算有用,像是 matrix 或是 FFT/DCT transform 等,對一般整數運算沒有任何幫助,這就是為什麼 p4 只有 video/audio encoding 強的原因,但是運算一但複雜,牽扯到 data dependency,尤其是越複雜的運算,p4 過長的 pipeline 就是最大致命傷,性能馬上暴跌。 此文章於 2005-08-07 10:23 PM 被 jasonyang 編輯. |
|
|
|