2008-11-07 58 views
7

我正在尋找諸如在多處理器的情況下甚至可能破壞代碼的重新排序代碼的事情。處理器如何優化代碼有哪些技巧?

+0

可否請你更新到這一短語在問題的形式? – 2008-11-07 14:36:58

+0

你的意思是編譯器嗎?因爲你會得到截然不同的答案... – 2008-11-07 14:36:59

+0

哪個編譯器?哪個平臺? – 2008-11-07 14:37:31

回答

0

維基百科的優化技術here相當全面的清單。

0

是的,但究竟是什麼問題?

但是,由於這是一個有趣的話題:編譯器和處理器用來優化代碼的技巧不應該在代碼中沒有競爭條件的情況下破壞代碼,即使使用多個處理器也是如此。這被稱爲順序一致性的保證:如果你的程序沒有任何競爭條件,並且所有數據在訪問之前都被正確地鎖定,那麼代碼將按照順序執行。

有香草薩特的一個很好的視頻說起這個位置:

http://video.google.com/videoplay?docid=-4714369049736584770

每個人都應該看這個:)

13

最重要的將是內存訪問重新排序。

缺少內存隔離或序列化指令,處理器可自由重新排序內存訪問。一些處理器體系結構對它們可重新排序的次數有限制; Alpha被認爲是最弱的(即可以重新排序最多的那個)。

在Linux內核源文檔的Documentation/memory-barriers.txt處可找到有關該主題的非常好的處理方法。大多數情況下,最好使用來自編譯器或標準庫的鎖定原語;這些都經過了充分的測試,應該具備所有必要的內存屏障,並且可能是相當優化的(優化鎖定原語是非常棘手的;即使專家有時也會讓它們錯誤)。

0

DavidK的回答是正確的,但是瞭解語言/運行時的內存模型也非常重要。即使沒有競爭條件並且具有連續一致性和互斥鎖使用情況,當數據由在cpu的不同核心中運行的不同線程緩存數據時,您的代碼仍然可能會中斷。一些語言,Java是一個例子,確保了在使用互斥鎖時線程之間的數據狀態,但僅僅確保沒有兩個線程能夠同時訪問數據是不夠的。您需要以正確的方式使用互斥鎖,以確保語言運行庫同步兩個線程之間的數據狀態。在java中,這是通過讓兩個線程在同一個對象上同步來完成的。

這是一個很好的網頁,解釋問題以及如何在javas記憶模型中處理它。

http://gee.cs.oswego.edu/dl/cpj/jmm.html