Вычисление времени первого прохождения может быть обобщено как следующий код:
def Next(x):
# function details
return y
x=0
steps=0
while x<target:
x=Next(x)
steps+=1
print steps
Существует функция Next()
, которая возвращает следующее состояние, и вы хотите продолжать работать до достижения target
. Вы выводите количество сделанных шагов.
Чтобы вычислить среднее время первого прохождения, необходимо выполнить много траекторий и усреднить их. Поскольку одна траектория может выполняться независимо от другой, я хочу использовать графический процессор для использования этого распараллеливания.
Я пытаюсь использовать numba
. До сих пор я пробовал что-то вроде этого:
from numba import cuda,jit
@jit(target = 'gpu')
def Next(x):
k=cuda.grid(1)
# function details
x[k] = new_value #details ommitted
def main(num_paths):
block_size = cuda.get_current_device().MAX_THREADS_PER_BLOCK
grid_size = int(math.ceil(float(num_paths)/block_size))
stream = cuda.stream()
d_x = cuda.device_array(num_paths, dtype=np.int, stream=stream)
Next_cfg = Next[grid_size,block_size, stream]
У меня трудности с реализацией цикла while
. Я хотел бы прекратить симуляции, когда все траектории достигли target
. Но для этого потребуется CPU-GPU для общения. Как мне поступить?