我有一個示例代碼來說明這個問題:import numpy as npfrom numba import cuda, typesimport configsdef main(): arr = np.empty(0, dtype=np.uint8) stream = cuda.stream() d_arr = cuda.to_device(arr, stream=stream) kernel[configs.BLOCK_COUNT, configs.THREAD_COUNT, stream](d_arr)@cuda.jit(types.void( types.Array(types.uint8, 1, 'C'),), debug=configs.CUDA_DEBUG)def kernel(d_arr): arr = cuda.const.array_like(d_arr)if __name__ == "__main__": main()當(dāng)我用 cuda-memcheck 運行這段代碼時,我得到:numba.errors.ConstantInferenceError: Failed in nopython mode pipeline (step: nopython rewrites)Constant inference not possible for: arg(0, name=d_arr)這似乎表明我傳入的數(shù)組不是常量,因此無法將其復(fù)制到常量內(nèi)存中——是這樣嗎?如果是這樣,我如何將作為輸入提供給內(nèi)核的數(shù)組復(fù)制到常量內(nèi)存?
1 回答

守著一只汪
TA貢獻1872條經(jīng)驗 獲得超4個贊
您不會使用作為輸入提供給內(nèi)核的數(shù)組復(fù)制到常量數(shù)組。該類型的輸入數(shù)組已在設(shè)備中,設(shè)備代碼無法寫入常量內(nèi)存。
常量內(nèi)存只能從主機代碼寫入,并且常量語法期望數(shù)組是主機數(shù)組。
這是一個例子:
$ cat t32.py
import numpy as np
from numba import cuda, types, int32, int64
a = np.ones(3,dtype=np.int32)
@cuda.jit
def generate_mutants(b):
c_a = cuda.const.array_like(a)
b[0] = c_a[0]
if __name__ == "__main__":
b = np.zeros(3,dtype=np.int32)
generate_mutants[1, 1](b)
print(b)
$ python t32.py
[1 0 0]
$
請注意,與 CUDA C/C++ 相比,Numba CUDA 中常量內(nèi)存的實現(xiàn)有一些行為差異,這個問題突出了其中的一些差異。
添加回答
舉報
0/150
提交
取消