適用於CUDA GPU的Numba 隨機數生成

2022-02-03 11:21:20 字數 3906 閱讀 2750

適用於cuda gpu的numba 隨機數生成

隨機數生成

numba提供了可以在gpu上執行的隨機數生成演算法。由於nvidia如何實現curand的技術問題,numba的gpu隨機數生成器並非基於curand。相反,numba的gpu rng是xoroshiro128 +演算法的實現。xoroshiro128 +演算法的週期為2**128 - 1,比curand中預設使用的xorwow演算法的周期短,但是xoroshiro128 +演算法仍然通過了隨機數發生器質量的bigcrush測試。

在gpu上使用任何rng時,重要的是要確保每個執行緒都有其自己的rng狀態,並且它們已初始化為產生不重疊的序列。numba.cuda.random模組提供了執行此操作的主機功能,以及提供統一或正態分佈的隨機數的cuda裝置功能。

注意

numba (like curand) uses the box-muller transform 從統一生成器生成正態分佈的隨機數。但是,box-muller生成隨機數對,當前實現只返回其中之一。結果,生成正態分佈的值是均勻分布的值的速度的一半。

numba.cuda.random.create_xoroshiro128p_states(n,seed,subsequence_start=0,stream=0)

返回為n個隨機數生成器初始化的新裝置陣列。

這將初始化rng狀態,以便陣列中的每個狀態與主序列中彼此分開2 ** 64步的子串行相對應。因此,只要沒有cuda執行緒請求超過2 ** 64個隨機數,就可以保證此函式產生的所有rng狀態都是獨立的。

subsequence_start引數可用於將第乙個rng狀態提前2 ** 64步的倍數。

引數:

numba.cuda.random.init_xoroshiro128p_states(states,seed,subsequence_start=0,stream=0)

在gpu上為並行生成器初始化rng狀態。

這將初始化rng狀態,以便陣列中的每個狀態與主序列中彼此分開2 ** 64步的子串行相對應。因此,只要沒有cuda執行緒請求超過2 ** 64個隨機數,就可以保證此函式產生的所有rng狀態都是獨立的。

subsequence_start引數可用於將第乙個rng狀態提前2 ** 64步的倍數。

引數:

numba.cuda.random.xoroshiro128p_uniform_float32

返回範圍為[0.0,1.0)的float32並前進states[index]

引數:

返回型別:

float32

numba.cuda.random.xoroshiro128p_uniform_float64

返回範圍為[0.0,1.0)的float64並前進states[index]

引數:

返回型別:

float64

numba.cuda.random.xoroshiro128p_normal_float32

返回正態分佈的float32並前進states[index]

使用box-muller變換從平均值= 0和sigma = 1的高斯中得出返回值。這使rng序列前進了兩個步驟。

引數:

返回型別:

float32

numba.cuda.random.xoroshiro128p_normal_float64

返回正態分佈的float32並前進states[index]

使用box-muller變換從平均值= 0和sigma = 1的高斯中得出返回值。這使rng序列前進了兩個步驟。

引數:

返回型別:

float64

這是使用隨機數生成器的示例程式:

from__future__importprint_function, absolute_import

fromnumbaimportcuda

fromnumba.cuda.randomimportcreate_xoroshiro128p_states, xoroshiro128p_uniform_float32

importnumpyasnp

@cuda.jit

defcompute_pi(rng_states, iterations, out):

"""find the maximum value in values and store in result[0]"""

thread_id = cuda.grid(1)

# compute pi by drawing random (x, y) points and finding what

# fraction lie inside a unit circle

inside = 0

foriinrange(iterations):

x = xoroshiro128p_uniform_float32(rng_states, thread_id)

y = xoroshiro128p_uniform_float32(rng_states, thread_id)

ifx**2 + y**2 <= 1.0:

inside += 1

out[thread_id] = 4.0 * inside / iterations

threads_per_block = 64

blocks = 24

rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=1)

out = np.zeros(threads_per_block * blocks, dtype=np.float32)

compute_pi[blocks, threads_per_block](rng_states, 10000, out)

print('pi:', out.mean())

適用於python的 vimrc檔案

根據我的需求做了一些小的改動。file vimrc date 2009 09 22 author gashero note 配置乙份簡單的vim配置檔案 set nocompatible 非相容模式 syntax on 開啟語法高亮 set background dark 背景色 color des...

多執行緒適用於阻塞式IO場景,不適用於平行計算場景

python的標準實現是cpython。cpython執行python 分為2個步驟 首先,將文字原始碼解釋編譯為位元組碼,然後再用乙個直譯器去 解釋執行位元組碼。位元組碼直譯器是有狀態的,需要維護該狀態的一致性,因此使用了gil global interpreter lock,全域性直譯器鎖 gi...

Extjs Form用法詳解(適用於Extjs5)

extjs form用法詳解 適用於extjs5 extjs form是乙個比較常用的控制項,主要用來顯示和編輯資料的,今天這篇文章將介紹extjs form控制項的詳細用法,包括建立form 新增子項 載入和更新資料 驗證等。本文的示例 適用於extjs 4.x和extjs 5.x,在extjs ...