Большая разница во времени выполнения первого и последующего запуска функций Cupy - PullRequest
0 голосов
/ 20 июня 2020

Когда я запускаю функции 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

1 Ответ

1 голос
/ 23 июня 2020

CuPy выполняет своевременную компиляцию ядра под капотом при первом использовании функции в процессе Python, что занимает немного времени.

Из документации CuPy :

CuPy использует синтез ядра на лету: когда требуется вызов ядра, он компилирует код ядра, оптимизированный для форм и типов заданных аргументов, отправляет его на графический процессор устройство и выполняет ядро. Скомпилированный код кэшируется в каталог $ (HOME) /. Cupy / kernel_cache (этот путь кеша можно перезаписать, установив переменную среды CUPY_CACHE_DIR). Это может замедлить работу при первом вызове ядра, хотя это замедление будет устранено при втором выполнении. CuPy также кэширует код ядра, отправленный на устройство GPU в процессе, что сокращает время передачи ядра при последующих вызовах.

...