我需要一個可重複的僞隨機函數,從[0,1]中的浮點數到[0,1]中的浮點數。即給定一個32位的IEEE浮點數,返回一個「不同的」(儘可能隨機,給定24位尾數)。它必須是可重複的,所以保持大量的內部狀態。不幸的是,它只能使用32位整數和單浮點數學運算(沒有雙精度,甚至不是32x32 = 64位乘法,儘管我可以根據需要模擬它 - 基本上它需要在較早的CUDA硬件上工作)。當然,隨機性越好越好,在這些嚴重的限制之內。有人有主意嗎? (我已經通過Park-Miller,需要64位int數學,需要雙打的Park-Miller的CUDA版本,擁有很多內部狀態的Mersenne Twisters,以及其他幾個不需要的東西沒有工作。)爭奪一個浮點數?
爭奪一個浮點數?
回答
最好我理解需求,哈希完成所需的功能。將float輸入重新解釋爲一個整數,應用散列函數生成一個近似均勻分佈在[0,2^32)中的整數,然後將該整數乘以2^-32將生成的整數大致均勻地轉換回浮點數分佈在[0,1]。一個不需要乘法的散列函數是Bob Jenkin的mix(),它可以在這裏找到:http://www.burtleburtle.net/bob/hash/doobs.html。
要將float的位重新解釋爲整數,反之亦然,在CUDA中有兩個選擇。使用內部函數,或用C++ - 風格重新詮釋轉換:
float f;
int i;
i = __float_as_int(f);
f = __int_as_float(i);
i = reinterpret_cast<int&>(f);
f = reinterpret_cast<float&>(i);
因此,作爲一個獨立的功能,整個過程可能是這個樣子:
內部STATE_的/* transform float in [0,1] into a different float in [0,1] */
float scramble_float (float f)
{
unsigned int magic1 = 0x96f563ae; /* number of your choice */
unsigned int magic2 = 0xb93c7563; /* number of your choice */
unsigned int j;
j = reinterpret_cast<unsigned int &>(f);
mix (magic1, magic2, j);
return 2.3283064365386963e-10f * j;
}
的NVIDIA CUDA工具包包括一個名爲CURAND庫,我相信符合您的要求:它會產生重複的結果(假設你開始使用相同的種子),工作於GPU,支持32位浮點和整數,並應該在較早的GPU上工作。它還支持多種僞隨機和準隨機生成算法和分佈。 (注意:使用C庫rand()函數的問題(除了它不能在CUDA中運行)在Windows上,rand()只返回一個16位的值,因此由RAND_MAX劃分的任何浮點數只有16個隨機位的精度。更重要的是,在linux/mac上它返回一個32位的值,所以使用它的代碼在數字上並不便攜。]
您的回答是正確的,因爲我提出了問題 - 謝謝。不幸的是我遺漏了一項要求;在CPU上運行時,我需要與GPU上相同的值,因此只有CUDA的庫不適用於我。這就是爲什麼我一直試圖自己做,所以我可以得到便攜式(GPU/CPU)代碼。 – GaryO 2011-06-01 13:38:35
curand_kernel.h中的curand設備API的實現非常清晰 - 你可以非常平凡地移植到CPU上。作爲開始,您可以嘗試更改該文件中的#define QUALIFIERS,以便代替'#define QUALIFIERS static inline __device__',而不是'#define QUALIFIERS static inline __device__ __host__'。這應該使您從設備內核調用的所有功能都可以從主機代碼中調用。 (可能還有其他問題,我沒有嘗試過)。 – harrism 2011-06-02 04:58:47
或者,您可以使用curand主機API在GPU上生成一個隨機值數組,然後將該數組複製回主機以用於CPU代碼。 – harrism 2011-06-02 04:59:15
- 1. 如何爭奪一個字符串
- 2. 爭奪Python列表
- 3. Bash-爭奪字符
- 4. 爭奪字符串
- 5. 正則表達式爭奪唯一的最後一個數字
- 6. 故事板爭奪多個視圖?
- 7. SQL爭奪數據庫varchar字段
- 8. 方法來解決兩個字符列爭奪一個文本
- 9. 爭奪緯度經度座標的JavaScript
- 10. 爭奪詞算法的幫助,請
- 11. 用一個浮點數
- 12. 使一個整數浮點數
- 13. 獲得一個浮點數的倒數?
- 14. 計算整數和一個浮點數
- 15. 將小數位數多的浮點數轉換爲浮點數只有一個小數位的浮點數
- 16. 兩個浮點數
- 17. 漂浮在一個浮點內的dotnetnuke?
- 18. 舍入一個浮點數在objective-c
- 19. Python:總結一個浮點數
- 20. 中心一個div浮點數
- 21. 從istream獲取下一個浮點數?
- 22. 檢查一個浮點數的長度
- 23. QtGui QTreeWidgetItem setData保存一個浮點數
- 24. postgreql to_char格式化一個浮點數
- 25. 2浮點數做一個計算
- 26. 添加一個浮點數組
- 27. 在For循環中輸入一個數組,但只浮出一個浮點數
- 28. 尋找一個半浮點或四分之一浮點庫
- 29. 另一個浮點問題
- 30. 是否有可能在浮點二進制數中有一個浮點指數?
_Tons並不意味着_not reproducible_。你是否嚴格需要一個函數來返回一個'float'給定的'float',並且兩者之間的相關性很難被發現?還是你真的在尋找一個具有有限計算能力的好的僞隨機數發生器? – sarnold 2011-05-31 22:58:16
函數應該是可逆的還是不可以?它需要密碼強大嗎? – caf 2011-06-01 03:57:30
Invertible?號密碼強?不,我是爲了圖形目的而做的,所以我需要合理分佈的結果。基本上給了一個(x,y)作爲浮點數,我希望我的函數只返回一個新的僞隨機(x,y)點作爲原始x,y的函數。或者1維相同:給定x,返回x',其中x'「看起來」隨機。我的意思是可重複的結果必須純粹是輸入的函數。 – GaryO 2011-06-01 13:42:25