PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 電腦硬體討論群組 > 效能極限
帳戶
密碼
 

  回應
 
主題工具
熱鬥小狐
*停權中*
 
熱鬥小狐的大頭照
 

加入日期: Apr 2001
您的住址: 香港
文章: 1,441
引用:
作者littleshan
不需要。SMP中的spin-lock程式碼行之多年,把它改成monitor/mwait的形式不但浪費人力,效能也不會比較好。
再者,使用spin-lock或是monitor/mwait必需根據CPU屬於真正的physical core亦或是logical core,而這部分必需交給OS來做。也就是說,這兩支指令應該只有在OS實做synchronization時才會用到的。一般的應用程式根本不需要用這麼低階的指令,而應該用OS提供的system call來達到synchronization的功能。這樣做不但簡單易懂,也不會有相容性的問題。

沒有人說要把spin-lock程式碼改成monitor/mwait的形式執行
而是相反,把monitor/mwait程式碼改成spin-lock的形式執行
這樣開發商只需要為P4寫一次程式碼就可以直接拿到K8執行

當然也可以用你的方法,但就必須修改程式碼了
相對於開發商來說未必是好事,因為開發時間會長了,多一個選擇給他們並不是壞事
     
      
舊 2005-08-07, 03:39 PM #21
回應時引用此文章
熱鬥小狐離線中  
littleshan
New Member
 

加入日期: Jan 2005
文章: 6
引用:
作者熱鬥小狐
沒有人說要把spin-lock程式碼改成monitor/mwait的形式執行
而是相反,把monitor/mwait程式碼改成spin-lock的形式執行
這樣開發商只需要為P4寫一次程式碼就可以直接拿到K8執行

當然也可以用你的方法,但就必須修改程式碼了
相對於開發商來說未必是好事,因為開發時間會長了,多一個選擇給他們並不是壞事


你看起來沒有了解我的意思,讓我說具體一點好了。
你好像以為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上跑得很愉快。
 
舊 2005-08-07, 04:43 PM #22
回應時引用此文章
littleshan離線中  
deenzyyg
Power Member
 
deenzyyg的大頭照
 

加入日期: Feb 2005
您的住址: 葫蘆墩
文章: 561
舊 2005-08-07, 05:59 PM #23
回應時引用此文章
deenzyyg離線中  
熱鬥小狐
*停權中*
 
熱鬥小狐的大頭照
 

加入日期: Apr 2001
您的住址: 香港
文章: 1,441
引用:
作者littleshan
你看起來沒有了解我的意思,讓我說具體一點好了。
你好像以為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身上,所謂「開發廠商」並...

上面的寫法已經把兩種指令包括在內,若可以使用spin-lock就使用spin-lock
不行就使用monitor/mwait去做相同的工作
似乎Intel寫SSE3時有考慮到這點,那我推翻自己的說法
舊 2005-08-07, 09:30 PM #24
回應時引用此文章
熱鬥小狐離線中  
jasonyang
Major Member
 

加入日期: Sep 2004
您的住址: 木柵動物園
文章: 293
引用:
作者littleshan
不需要。SMP中的spin-lock程式碼行之多年,把它改成monitor/mwait的形式不但浪費人力,效能也不會比較好。
再者,使用spin-lock或是monitor/mwait必需根據CPU屬於真正的physical core亦或是logical core,而這部分必需交給OS來做。也就是說,這兩支指令應該只有在OS實做synchronization時才會用到的。一般的應用程式根本不需要用這麼低階的指令,而應該用OS提供的system call來達到synchronization的功能。這樣做不但簡單易懂,也不會有相容性的問題。


不過以目前的 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 編輯.
舊 2005-08-07, 09:39 PM #25
回應時引用此文章
jasonyang離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是06:24 AM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。