2012-02-28 60 views
1

這是一個非常普遍的問題,大多隻是概念上的問題。我正在考慮測試隨機數生成器,以查看其在某些x值(如擲骰子的前6位)上的均勻分佈的有效性。在一個簡單的循環中這樣做是我現在擁有它,但我正在考慮多線程仿真。帶信號量和僞隨機數的概念多線程

我想知道這是否會給我任何加速,因爲我將只有一個隨機數生成器在信號量保護的所有線程之間共享(需要確保沒有兩個線程訪問並且同時生成隨機數意味着重複結果)。由於每個線程幾乎不會有其他操作(只要用於檢查和增加x的語句)會對它進行線程化,甚至會給我更快的結果,或者對一個隨機數生成器的依賴性意味着它將基本上與單個相同線?

回答

0

理論上你應該看到性能的增加,至少在線程數量等於正在使用的內核數量之前。但是,實際上,您將添加代碼(並因此執行時間)來處理多線程基礎結構,並且如果每個線程的大部分時間都花在等待慢RNG上,您可能會看到性能下降。

另一方面,您可能可以通過一些巧妙的方式提高性能。例如,您可能有一項任務專門用於生成隨機數,如果您只查找1到6的值,則可能能夠從RNG的每個結果中生成多個值。您可以將這些值放入隊列中,讓其他任務從隊列中讀取。當然,你必須小心,你的優化不會改變RNG的分佈。

除非計算執行週期的想法激起你的興趣,否則找到答案的最好方法就是嘗試它。使用探查器來發現大部分時間都花在了什麼地方 - 這對於人類直覺而言是非常困難的,甚至有經驗的開發人員經常對結果感到驚訝。

+0

非常棒的建議,從結果處理中分離出rng。不完全確定我將如何使用1 rng來模擬多個卷,而不會與分配有關。我從來沒有使用過一個分析器,需要一個藉口來啓動,我認爲不應該使用它作爲一個,謝謝。 – forTruce 2012-02-28 16:18:54

+0

只是一個簡單的例子:如果您生成的數字從1到6,則每個數字只需要3位。如果您的RNG生成32位值,則可以從每個值中獲得10組3位。 – 2012-02-28 16:23:40

+0

我真的懷疑你會看到在另一個線程中運行RNG的速度提升。同步隨機數隊列的開銷遠遠超過任何好處。 – Gray 2012-02-28 16:45:35

5

我想你已經回答了你自己的問題。您的計劃將導致單線程使用RNG,不同線程輪流使用單個線程。你可能會達到一個加速,但只有一個負面的。

+1

「達到加速」真的意思是「影響速度」?加速對我意味着積極。 – Gray 2012-02-28 16:07:02

+0

+1,是的,這是RNG時間加上鎖定開銷 - 毫無意義。 – 2012-02-28 16:08:48

0

需要確保沒有兩個線程訪問,並在 產生隨機數的同時

這是不是意味着真的只有一個工作線程將被運行,所以你不使用多線程的好處。或者我錯過了你提到的在multipel線程上分發一些工作的一點?

如果您以某種方式改進了多線程RNG訪問的總體設計 - 考慮使用ReaderWriterLock技術而不是Semaphore

+0

我猜我認爲可能會在一定程度上加速,因爲一個線程會訪問rng,然後必須檢查和Inc相應的值。當它這樣做時,另一個線程將訪問rng。另外,我很好奇地拒絕readereriterlock和他的這可能會幫助,會產生下一個號碼requirewriter訪問rng更新種子值?肯定說出來我的屁股在這裏。 – forTruce 2012-02-28 16:14:16

+0

我相信解決方案取決於RNG的實施,您是使用自制還是內置?您正在使用哪種語言/框架進行開發? – sll 2012-02-28 16:23:10

+0

目前我只是使用內置於rng的C#。 – forTruce 2012-02-28 16:28:38