0

当我在cupy数组上运行cupy函数时,第一次调用函数比第二次运行花费的时间要长得多,即使我第二次在不同的数组上运行它也是如此。

为什么是这样?

import cupy as cp
cp.__version__
# 7.5.0

A = cp.random.random((1024, 1024))
B = cp.random.random((1024, 1024))

from time import time
def test(func, *args):
    t = time()
    func(*args)
    print("{}".format(round(time() - t, 4)))
    
test(cp.fft.fft2, A)
test(cp.fft.fft2, B)
# 0.129
# 0.001
test(cp.matmul, A, A.T)
test(cp.matmul, B, B.T)
# 0.171
# 0.0
test(cp.linalg.inv, A)
test(cp.linalg.inv, B)
# 0.259
# 0.002
4

1 回答 1

1

当您第一次在 Python 进程中使用函数时,CuPy 会即时编译内核,这需要一些时间。

从 CuPy文档中:

CuPy 使用动态内核合成:当需要内核调用时,它会编译针对给定参数的形状和 dtype 优化的内核代码,将其发送到 GPU 设备,然后执行内核。编译后的代码缓存到 $(HOME)/.cupy/kernel_cache 目录下(这个缓存路径可以通过设置 CUPY_CACHE_DIR 环境变量来覆盖)。它可能会在第一次内核调用时使事情变慢,尽管这种减速将在第二次执行时得到解决。CuPy 还会在进程内缓存发送到 GPU 设备的内核代码,从而减少进一步调用时的内核传输时间。

于 2020-06-23T02:48:12.467 回答