GPU 上使用 numba 的 Floyd-Warshall 算法
Floyd-Warshall algorithm on GPU using numba
我正在使用 numba 在 GPU 上编写优化的 Floyd-Warshall 算法。如果是 10k 矩阵,我需要它在几秒钟内工作。
现在处理大约在 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 上编写脚本还很陌生,所以你有什么想法可以让这段代码更快吗?我还在我的 GPU 上注意到,在处理时只有一个小峰值到 100%,然后它就不再忙了,所以问题可能出在从 CPU 向 GPU 发送数据时?如果是的话,有没有办法优化这个过程?或者也许我应该为此任务使用不同的算法?
事实证明,我的方法从一开始就是错误的,因为你不能直接并行化这个算法。这是一些很好的文章,如何使用代码执行此操作:
https://moorejs.github.io/APSP-in-parallel/#References
几天后,我将在评论中将此方法重写为 python numba 和 post ;)。
我正在使用 numba 在 GPU 上编写优化的 Floyd-Warshall 算法。如果是 10k 矩阵,我需要它在几秒钟内工作。 现在处理大约在 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 上编写脚本还很陌生,所以你有什么想法可以让这段代码更快吗?我还在我的 GPU 上注意到,在处理时只有一个小峰值到 100%,然后它就不再忙了,所以问题可能出在从 CPU 向 GPU 发送数据时?如果是的话,有没有办法优化这个过程?或者也许我应该为此任务使用不同的算法?
事实证明,我的方法从一开始就是错误的,因为你不能直接并行化这个算法。这是一些很好的文章,如何使用代码执行此操作:
https://moorejs.github.io/APSP-in-parallel/#References
几天后,我将在评论中将此方法重写为 python numba 和 post ;)。