适用于CUDA GPU的Numba 随机数生成
Numba實(shí)時變量分析
Numba使用引用計(jì)數(shù)進(jìn)行垃圾回收,這是一種需要編譯器配合的技術(shù)。Numba IR對必須插入decref的位置進(jìn)行編碼。這些位置通過實(shí)時變量分析確定。相應(yīng)的源代碼是https://github.com/numba/numba/blob/master/numba/interpreter.py中的_insert_var_dels() 方法。
在Python語義中,一旦在函數(shù)內(nèi)部定義了變量,該變量就一直存在,直到該變量被顯式刪除或函數(shù)作用域結(jié)束為止。但是,Numba會分析代碼,以根據(jù)每個變量在編譯期間的定義和用法來確定每個變量生命周期的最小范圍。一旦變量不可訪問,del就會在最接近的基本塊(下一個塊的開始或當(dāng)前塊的結(jié)尾)處插入一條指令。這意味著可以比常規(guī)Python代碼更早地釋放變量。
活動變量分析的行為會影響已編譯代碼的內(nèi)存使用情況。在內(nèi)部,Numba不會區(qū)分臨時變量和用戶變量。由于每個操作都會生成至少一個臨時變量,因此,如果不盡快釋放它們,函數(shù)可以累積大量的臨時變量。我們的生成器實(shí)現(xiàn)可受益于早期釋放變量,從而減小了在每個屈服點(diǎn)掛起的狀態(tài)的大小。
有關(guān)實(shí)時變量分析的行為的注意事項(xiàng)
變量在定義前已刪除
(相關(guān)問題:https : //github.com/numba/numba/pull/1738)
當(dāng)變量生存期被限制在循環(huán)體內(nèi)時(其定義和用法不會逃避循環(huán)體),例如:
def f(arr):
BB 0
res = 0
BB 1
for i in (0, 1):
# BB 2
t = arr[i]
if t[i] > 1:
# BB 3
res += t[i]
BB 4
return res
變量t永遠(yuǎn)不會在循環(huán)外部被引用。甲del指令發(fā)出用于t在所述環(huán)路(BB 1)的頭部被定義的變量之前。一旦知道了控制流程圖,原因就很明顯了:
變量t在BB 1中定義。在BB 2中,uses使用 t的評估t[i] > 1,執(zhí)行錯誤分支的最后使用,然后轉(zhuǎn)到BB1。在BB 3中,t is only used in res += t[i],如果執(zhí)行采用了錯誤分支,最后使用真正的分支。因?yàn)锽B 3是BB 2的后續(xù)分支使用,所以必須在通用的前身中將其刪除。最接近的點(diǎn)是BB 1,尚未從BB 0的輸入邊t定義。
如果t在BB 4處將其刪除,仍將必須在定義變量之前將其刪除,可以在不執(zhí)行定義變量的循環(huán)體(BB 2和BB 3)的情況下執(zhí)行BB4。
總結(jié)
以上是生活随笔為你收集整理的适用于CUDA GPU的Numba 随机数生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适用于CUDA GPU的Numba例子
- 下一篇: Hashing散列注意事项