Я пишу оптимизированный алгоритм Флойда-Уоршалла на графическом процессоре с использованием numba. Мне нужно, чтобы он работал за несколько секунд в случае 10к матриц. Сейчас обработка сделана примерно за 60-е годы. Вот мой код:
def calcualte_distance_to_all_gpu(matrix):
threadsperblock = (32, 32)
blockspergrid_x = math.ceil(matrix.shape[0]/ threadsperblock[0])
blockspergrid_y = math.ceil(matrix.shape[1] / threadsperblock[1])
blockspergrid = (blockspergrid_x, blockspergrid_y)
calculate_distance_to_all_cuda[blockspergrid, threadsperblock](matrix)
@cuda.jit
def calculate_distance_to_all_cuda(matrix):
i, j = cuda.grid(2)
N = len(matrix)
for k in prange(N):
if i < matrix.shape[0] and j < matrix.shape[1]:
if matrix[i, k] + matrix[k, j] < matrix[i, j]:
matrix[i, j] = matrix[i, k] + matrix[k, j]
Честно говоря, я новичок в написании скриптов на GPU, так что у вас есть идеи, как сделать этот код еще быстрее? Я также заметил на своем графическом процессоре, что во время обработки есть только небольшой пик до 100%, а затем он перестает быть занятым, поэтому, возможно, проблема в отправке данных с процессора на графический процессор? Если да, можно ли как-нибудь оптимизировать этот процесс? Или, может быть, мне стоит использовать другой алгоритм для этой задачи?