2013-03-26 41 views
0

我對CUDA語言很新穎,我需要對粒子進行模擬,在每個時間步驟更新,在它們的位置添加一個隨機值(彼此不同,但遵循相同的分配)。curand狀態在恆定內存(cuda隨機)

我的想法是給每個粒子不同curandState(具有不同的種子),和在每個時間步簡單地做一個curand(curandState [particle_id])。

我在想我可以將隨機狀態和粒子ID存儲在GPU上的常量內存中。但是我沒有看到有人在那裏做這件事,會不會增加記憶問題?這可以加速程序嗎?

謝謝你的幫助:)

回答

4

我不認爲這是有道理的。內存不變,不能直接由GPU上運行的線程修改。然而,每次線程生成一個隨機數時,curandState都需要修改(否則,您會得到相同的數字,反覆生成)。

給予每個粒子自己的狀態沒有任何錯誤;這將是該場景的典型用法。

由於curandState的檢索和使用以及隨機數的生成由GPU上的NVIDIA庫完成,因此您可以假設NVIDIA工程師在優化內存訪問方面做得相當不錯,以便高效並在檢索和更新狀態的操作期間合併,並生成隨機數。

__constant__內存還具有每個時鐘只爲每個SM提供一個32位值的特性,所以當所有線程訪問相同的數據元素(即廣播)時非常有用,但當每個線程訪問不同的元素(如單獨的curandState)即使訪問通常會合並,例如如果它在普通的全球記憶中。