2011-03-12 21 views
7

什麼是最快的x86彙編代碼來同步對內存中數組的訪問?最快的x86彙編代碼來同步對數組的訪問?

更確切地說:我們在內存中有一個malloc化的連續單頁區域,操作系統在我們的實驗期間不會調出這個區域。一個線程將寫入數組,一個線程將從數組中讀取。陣列很小,但比你的cpu的原子寫入能力還要大(這樣就需要一個單獨的鎖)

「最快」:有效速度:不只是假設字節碼的長度很重要,考慮到關於周圍代碼的鎖定和分支行爲的緩存行爲。

它具有上的x86-32和/或工作的x86-64

它必須在最上層的(或後代)工作的Windows XP以來,Linux的內核以來2.2,或MAXOS X(用戶-模式)。

請不要「它取決於」 - 迴應:如果它取決於我在這裏沒有指定的任何東西,只需編寫自己的示例並說明在那些/那些情況下最快的。

郵政編碼! (這是爲了防止模糊的描述)

郵政不僅是你的2線LOCK + CMPXCHG比較&交換,但我們展示你如何在一個線程讀取指令和其他寫指令整合它。

如果您喜歡,請解釋您對緩存最優化的調整,以及如果分支目標依賴於(1)是否獲取鎖定(2)較大的第一個字節-read是。

如果您喜歡區分多重處理和任務切換:如果線程不是在2 cpus上執行,而是隻保留一個,您的代碼將如何執行?

+0

@Ken白:哈哈好笑。或者你是認真的?如果是這樣的話:看看我使用的術語和我已經回答的問題。 – 2011-03-12 16:54:10

+0

@Ken - 我會對把這種類型的問題作爲家庭作業的學校非常感興趣。 – linuxuser27 2011-03-12 16:55:38

+0

@eznme,我讀了使用的術語。它看起來像直接從教科書中出來的東西。 「不僅僅是發佈你的2線......而是展示」。沒有任何意圖 - 它看起來並不像一個典型的問題所包含的東西。 @ linuxuser27,你看過MIT或RIT的任何高級課程嗎? – 2011-03-12 17:00:48

回答

1

我不明白。總線鎖定(鎖定前綴或xchg mem,reg指令)和速度與對方無關。這是關於將CPU與系統中最慢的活動設備(可能通過33 MHz PCI或某些設備連接)進行物理同步,並且您可以打賭它會比不在緩存中的RAM訪問慢得多。所以預計300-3000個CPU時鐘週期取決於您需要等待設備的時間。如果沒有設備處於活動狀態,您仍然需要等待相應的總線確認鎖定。

最快的代碼?算了吧。您需要接受這是總線鎖定的工作方式,或者找到其他不需要總線鎖定的同步方式。

-1

如果鎖定性能很重要,那麼你做錯了什麼。

+0

是的,我大多數人都同意。如果工作塊足夠大,則分攤鎖定成本。 – 2011-03-13 23:22:44

2

真的,答案是「這取決於」。你陣列的使用模式是什麼?大部分是閱讀?它是否更新 - 主要是,你可以擺脫不精確的結果閱讀(使用每個CPU數組)?更新非常少,以至於RCU可以提高性能。

有很多權衡這裏,看到了保羅麥肯尼的書:Is Parallel Programming Hard, And, If So, What Can You Do About It?