1.
最近發現一個問題,在AMD64位雙核的CPU上運行IOMeter進行磁碟效能測試,測得的response time等資料為0,顯然不符合邏輯。我下載了IOMeter的原始碼(http://www.iometer.org/doc/downloads.html)進行調試,發現可能和一條彙編指令rdtsc有關。這條指令返回自CPU上電以來經曆的刻度,是用來進行高精度計時的強有力工具。AMD64用的指令集是x86_64,難道x86_64的該指令和普通32位的x86指令不相容。不會的,AMD當年推出AMD64的時候,強調的就是和x86完全相容。
我做了進一步的調試,發現IOMeter計算得到的IO處理時間竟然為負數。也就是說,對於同一個IO請求,完成的時候用rdtsc統計的時間小於開始的時候統計的時間。顯然這個不符合常理。難道時光倒流了。………………突然,我想到我用的是雙核,也許開始和完成時的時間統計是由不同的核處理的,這兩個核的時間不一樣。
我在工作管理員中只給IOMeter的相關任務分配了1個CPU核,得到的結果一切正常。看來我的猜想是正確的。看來AMD64每個核心的時間是有點差別的。開機的時候,應該是先啟動一個核心,再啟動另外一個核心,然後兩個核心都忠實地記錄自己所運轉的時間,它們互相之間沒有進行同步。
我在Intel Dual Core上面也測試了IOMeter,沒有這個現象發生。網上看到有AMD64的雙核補丁,打了這個補丁會解決該問題嗎。我現在用的電腦是Intel CPU,只有等下次拿到AMD64再測試了。
2.
多核最佳化給很多軟體帶來了效能上的提升,但是又帶來一些新的問題。我試用Visual Stduio2005對IOMeter進行編譯,發現VS會莫名其妙地退出。開啟工作管理員,發現裡面有兩個cl.exe的進程。該進程正是VS的C++編譯器。可是,為什麼會出現cl.exe會出現兩份呢。我仔細查看了VS的輸出資訊,看到有兩個項目正在同時編譯。
原來,Visual Studio2005為雙核進行了最佳化,如果一個解決方案裡面有兩個項目,這兩個項目之間沒有依賴關係,則編譯的時候VS會同時處理兩個項目,充分利用雙核的平行處理能力。但是,如果這兩個項目共用了一些檔案(比如它們都會編譯同一個檔案,且產生的中間檔案也放在相同的路徑下),則同時啟動並執行cl.exe就發生了衝突,直接讓VS給掛掉了。這個問題很容易解決,給項目添加依賴關係,讓兩個項目按順序編譯。最好讓兩個項目的輸出目錄和中間目錄不一樣,進一步避免衝突。
多核還算比較新的技術,雖然很多軟體對它進行了最佳化,但是現階段不可能面面俱到。我們在多核CPU上使用軟體的時候,也要多加留意,進行適當的配置,從功能性和效率上充分發揮多核的能力。