2012-05-07 47 views
27

關於RDRAND指令的延遲或吞吐量,我找不到關於agner.org的任何信息。但是,這個處理器是存在的,所以信息必須在那裏。Ivy Bridge上的RDRAND指令的延遲和吞吐量是多少?

編輯:其實最新的優化手冊提到這個指令。它被記錄爲< 200個週期,Ivy Bridge上的總帶寬至少爲500MB/s。但是由於延遲和吞吐量是可變的,所以關於這條指令的一些更深入的統計數據會很好。

+0

我不知道答案,沒有運行基準測試,但作爲感興趣的一方,我可能會問:「你想要多快?」即哪些應用需要大量RDRAND?順便說一句,這裏有兩個分離的問題:(a)指令的速度在延遲和吞吐量方面有多快,但是(b)它能比熵池更快地讀取嗎?即你可以耗盡熵池,並且只是跑掉僞隨機數? –

+2

我能想到爲什麼有人會關心的唯一原因是決定是直接使用RDRAND還是通過PRNG。在這兩種情況下,你都會得到相同的可觀察行爲,但其中一個可能比另一個快得多,並且不會立即明白哪一個會是這樣。 (KrazyGlew:你的'b'是一種無關緊要的東西,就像問你在換水前得到了多少聖水一樣,兩者之間沒有任何可察覺的差異,在這種情況下,這種區別基本上是沒有意義的。) –

+0

@KrazyGlew一個用例正在爲GPU上的統計採樣生成隨機數。 – user239558

回答

28

我寫了librdrand。這是使用RdRand指令填充隨機數的緩衝區的一組非常基本的例程。

我們在IDF上展示的性能數據來自我寫的測試軟件,它使用Linux中的pthreads生成了多個線程。每個線程使用RdRand填充隨機數的內存緩衝區。該程序測量平均速度,並可以在改變線程數的同時進行迭代。

由於從每個核心到共享DRNG和返回的往返通信延遲時間比在DRNG上生成隨機數所需的時間要長,因此平均性能在添加線程時明顯增加,直到達到最大吞吐量。 IVB上DRNG的物理最大吞吐量爲800MBytes/s。具有8個線程的4核IVB管理大約780Mbytes/s的數量。使用更少的線程和內核,實現更少的數量。這個500MB/s的數字有點保守,但是當你試圖做出誠實的性能聲明時,你必須這麼做。由於DRNG以固定頻率(800MHz)運行,而核心頻率可能不同,因此根據核心頻率和同時訪問DRNG的其他內核的數量,每個RdRand的核心時鐘週期數會有所不同。以色列國防軍演示文稿中給出的曲線是對預期內容的現實描述。核心時鐘頻率對整體性能有一些影響,但並不多。線程的數量是主導。

測量RdRand性能以實際「使用」RdRand結果時應該小心。如果你不這樣做,I.E.你做了這個...... RdRand R6,RdRand R6,.....,RdRand R6重複了很多次,表現會被認爲是人爲的高。由於數據在覆蓋之前未被使用,因此CPU流水線不會等待數據從DRNG返回,然後纔會發出下一條指令。我們寫的測試將結果數據寫入內存中,這些內存將存儲在片上高速緩存中,以便流水線停止等待數據。這也是爲什麼超線程對RdRand比其他類型的代碼更有效的原因。

特定平臺,時鐘速度,Linux版本和GCC版本的詳細信息在IDF幻燈片中給出。我不記得我頭頂的數字。有些芯片速度較慢,芯片速度較快。我們給出的<每個指令200個週期的數量基於每條指令約150個核心週期的測量結果。

該芯片現已上市,所以熟悉使用rdtsc的人都可以進行同樣的測試。

+4

請添加IDF演示文稿的鏈接。 – Nathan

+3

「我寫了librdrand」 - 'nuf說。 – JebaDaHut

+0

那麼'rdrand'就像是一個高延遲負載? Agner Fog的數字表明IvB的吞吐量爲〜110c,Skylake的吞吐量爲〜460cpi。我很好奇有多少計算可以與'rdrand'重疊,因爲大多數使用隨機數的代碼實際上除了生成隨機數外還有很多工作要做。所以我很好奇它會減慢一些真正的代碼使用'RDRAND'代替像xorshift這樣的超快速PRNG,甚至是可能最快的非隨機數發生器:'xor eax,eax'。 –

7

您會在Intel Digital Random Number Generator (DRNG) Software Implementation Guide找到一些相關信息。

逐字報價如下:

測量吞吐量:

Up to 70 million RDRAND invocations per second 
500+ million bytes of random data per second 
Throughput ceiling is insensitive to the number of contending parallel threads 
+0

+1:非常漂亮的鏈接 – Necrolis

+0

@ user434507 - 總是很好地包含相關位。該鏈接可能會中斷,這個答案將變得毫無意義。我這次爲你做了這個:) – ArjunShankar

+0

Quote:'這具有熵提取濃縮樣品的效果。真棒,不是嗎? –

3

我做了一個實際的Ivy Bridge的一些初步的吞吐量測試i7-3770採用英特爾"librdrand"包裝和它產生33在單個內核上每秒可達-35百萬32位數字。

這個來自英特爾的70M數量約爲8個核心;對於一個他們只報告大約10M,所以我的測試超過3倍更好: -/

+0

你真的使用了結果嗎? David的回答說,如果結果寄存器被簡單覆蓋,CPU會丟棄不完整的「rdrand」uops。 (因此,例如,將內容存儲到內存或將其「XOR」) –

3

下面是一些性能數據我rdrand得到:http://smackerelofopinion.blogspot.co.uk/2012/10/intel-rdrand-instruction-revisited.html

在一個i5-3210M(2.5GHz的)IvyBridge的(2個核,4個線程)我得到每秒99600000個的64位rdrands的〜具有峯值4個線程,相當於每秒63.74億比特。 (3核心,8線程)我在3個線程上每秒鐘達到9960萬64位rdrands的峯值吞吐量。

+0

你如何調用'stress-ng'來獲得吞吐量數字?我能做的最好的是'stress-ng --rdrand 1 --metrics -t 60',但是這些指標(比如BogoMIPS)對我來說並不是很有用。 – jww

+0

試用:https://github.com/ColinIanKing/x86rdrand-benchmark –