Время поведения Cupy Scaling - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь эффективно вычислить на gpus с помощью cupy.

В моем конкретном приложении время выполнения timeit зависит от количества запусков (конечно). Однако не линейно, а линейно, сначала с небольшим наклоном, а затем с большим. Убедитесь сами: Билинейное увеличение времени выполнения с количеством выполнений

Мой вопрос: почему?

Я не очень разбираюсь в вычислениях на GPU или numeri c внутреннее. Я просто подумал, что это будет интересный вопрос.

Вот код того, как я измерял время

import cupy as cp
n = 401
s = 100
p = 100
x = cp.linspace(-5, 5, n, dtype=cp.float32)[:, cp.newaxis].repeat(s, 1)
sig = cp.random.uniform(.2, .4, (s, p), dtype=cp.float32)
a = cp.random.uniform(1, 2, (s, p), dtype=cp.float32)
c = cp.random.uniform(-3, 3, (s, p), dtype=cp.float32)


def cp_g(x, a, c, s):
    return cp.sum(cp.multiply(cp.exp(-cp.square(((x[...,cp.newaxis] - c) / s))), a * s / cp.sqrt(cp.float32(cp.pi))),axis=-1)


for i in cp.arange(10,1000,10):
     timeit('y= cp_g(x,a,c,sig)', globals=globals(), number=int(i))

PS: Если интересно, я использую оборудование GeForce 1660 Супер. Cuda 10.2. Python 3.7.0 (v3.7.0: 1bf9cc5093, 27 июня 2018 г., 04:59:51) [MS C v.1914 64 бит (AMD64)]

1 Ответ

0 голосов
/ 06 августа 2020

Это поведение легко понять!

Timeit блокируется до тех пор, пока не вернется поток процессора. Однако это не учитывает время графического процессора. Для этого нужно добавить одну строку кода к вызову timeit

timeit('y= cp_g(x,a,c,sig); cp.cuda.Device().synchronize()', ...)

Спасибо Leo Fang за ваш комментарий!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...