我使用numba的guvectorize编写了此代码,其target ='parallel'效果很好。我想使用target ='cuda'运行具有相同功能的代码,但是遇到很多问题。
我知道有一项政策规定不要在一个帖子中问多个问题,但可以分为多个部分,这就是其中之一。
可以正常工作的代码如下:
import numpy as np
from numba import vectorize, cuda, jit, njit, prange, float64, float32, int64, guvectorize
starting_size = 20
number_of_tumors = 5
time_interval = 5
@jit(nopython=True)
def make_array(number_of_rows, row_size, starting_size):
q = (0 * np.arange(number_of_rows*row_size) ).reshape(number_of_rows,row_size)
q[:,0]=starting_size
return(q)
array = (make_array(number_of_tumors, time_interval, starting_size))
@jit(nopython=True)
def make_variable_arrays(array):
array_of_zeros = (0 * np.arange(array.shape[0]*array.shape[1]) ).reshape(array.shape[0],array.shape[1])
shedding_array = array_of_zeros
return(shedding_array)
shedding_array = make_variable_arrays(array)
@guvectorize([(int64[:], int64[:], int64[:], int64[:])], '(n),(n)->(n),(n)', target = 'parallel')
def g(x, y, res, res_two):
res = x
res_two = y
for i in range(x.shape[0]-1):
shedding_var = np.random.poisson(( 4 * ((x[i])**.01) ),1)[0]
res_two[i] = shedding_var
res[i+1] = res[i] + shedding_var
g(array,shedding_array)
print(array)
print(shedding_array)
这将遍历“数组”的行,并使每行中的下一个值成为行中的前一个值,以及生成的numpy poisson随机变量。
将目标更改为“ cuda”时,出现错误:
assert len(self.outputsig)== 1,“仅支持1个输出” AssertionError:仅支持1个输出
我认为这意味着我只能更改1个数组,而使用cuda则不能更改2个数组。
为了弄清楚如何开始解决此问题,我制作了一个新函数,仅接受和更改一个数组。如下:
array = (make_array(number_of_tumors, time_interval, starting_size))
@guvectorize([(int64[:], int64[:])], '(n)->(n)', target = 'parallel')
def g(x, res):
res = x
for i in range(x.shape[0]-1):
shedding_var = np.random.poisson(( 4.02 * ((x[i])**.01) ),1)[0]
#shedding_var = 2
res[i+1] = res[i] + shedding_var
g(array)
print(array)
所以,我遇到了几个问题。
1)当我写target ='cuda'时,出现此错误:
那么,我可以在带有guvectorize装饰器的函数中甚至使用numpy函数吗?
2)当我摆脱np.random.poisson函数,而只是将shedding_var设置为2时,该函数运行良好。它会改变
但是当我将更改目标设为“ cuda”时,数组不变,它停留在
在函数g之前和之后。因此,不仅不能使用numpy poisson函数,而且不能使该函数遍历数组。
3)即使前面的两个问题都解决了,也有办法让函数像我的第一个函数那样在两个数组上操作,或者至少有一个数组的输入但输出两个数组吗?