所以我想利用這個自定義RNG庫針對OpenCL: http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html最佳方式
庫定義的狀態結構:
//! Represents the state of a particular generator
typedef struct{ uint x; uint c; } mwc64x_state_t;
而且爲了產生一個隨機UINT,你的狀態傳遞到下面的函數:
uint MWC64X_NextUint(mwc64x_state_t *s)
其更新狀態,所以,當你經過我t再次進入函數,序列中的下一個「隨機」數字將被生成。
爲我創造,我需要能夠同時生成隨機數不只是在不同的工作組/項目,但還可以在多個設備,我有麻煩找出最好的方式來設計這個項目。就像我應該創建每個設備/ commandqueue 1 mwc64x_state_t對象並將該狀態作爲全局變量傳遞?或者是否有可能一次爲所有設備創建1個狀態對象? 還是我甚至在把它作爲一個全局變量,每個內核函數內局部聲明一個新的狀態?
圖書館還配備了這一功能:
void MWC64X_SeedStreams(mwc64x_state_t *s, ulong baseOffset, ulong perStreamOffset)
據稱是應該的RNG分成多個「流」,但包括這在我的內核使得難以置信緩慢。舉例來說,如果我這樣做了以下非常簡單:
__kernel void myKernel()
{
mwc64x_state_t rng;
MWC64X_SeedStreams(&rng, 0, 10000);
}
然後內核調用變成40倍左右慢。
庫不來與作爲示例用法,但是示例代碼是一種有限的,似乎沒有是有幫助的一些源代碼。
所以如果有人熟悉OpenCL中的隨機數發生器,或者如果你已經使用了這種特殊的圖書館我以前很欣賞你的建議。
感謝您的信息和澄清!不幸的是,我的內核工作項目只需要對NextUint()進行大約12次左右的調用,所以它看起來不像彌補調用SeedStreams()的大量開銷。 – user1855952 2014-10-14 20:52:43