Вычисление среднего времени первого прохождения с использованием графического процессора - PullRequest
0 голосов
/ 26 октября 2018

Вычисление времени первого прохождения может быть обобщено как следующий код:

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 для общения. Как мне поступить?

...