Cupy становятся медленнее при увеличении итераций - PullRequest
0 голосов
/ 26 января 2019

Я учусь использовать Cupy. Но я нашел проблему действительно запутанной. Кажется, что cuy хорошо работает в программе сначала . Когда он работает некоторое время, Cupy кажется намного медленнее. Вот код:

import cupy as np
from line_profiler import LineProfiler

def test(ary):
    for i in range(1000):
        ary**6

def main():
    rand=np.random.rand(1024,1024)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)

lp = LineProfiler()
lp_wrapper = lp(main)
lp_wrapper()
lp.print_stats()

и вот время исполнения:

Timer unit: 2.85103e-07 s

Total time: 16.3308 s
File: E:\Desktop\test.py
Function: main at line 8

Line #      Hits         Time    Per Hit   % Time  Line Contents
==============================================================
     8                                             def main():
     9         1    1528817.0  1528817.0      2.7      rand=np.random.rand(1024,1024)
    10         1     111014.0   111014.0      0.2      test(rand)
    11         1      94528.0    94528.0      0.2      test(rand)
    12         1      95636.0    95636.0      0.2      test(rand)
    13         1      94892.0    94892.0      0.2      test(rand)
    14         1    7728318.0  7728318.0     13.5      test(rand)
    15         1   23872383.0 23872383.0     41.7      test(rand)
    16         1   23754666.0 23754666.0     41.5      test(rand)

Когда Кьюпи совершил 5000 раз силовых открытий, он становится очень медленным.

Я запустил этот код в Windows, и версия cuda 10.0

Надеюсь на ответы. Большое спасибо!


Спасибо за ваш ответ! Я напечатал использование памяти Cupy:

import cupy as np

def test(ary):
    mempool = cupy.get_default_memory_pool()
    pinned_mempool = cupy.get_default_pinned_memory_pool()
    for i in range(1000):
        ary**6
    print("used bytes: %s"%mempool.used_bytes())
    print("total bytes: %s\n"%mempool.total_bytes())

def main():
    rand=np.random.rand(1024,1024)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)
    test(rand)

и вот вывод:

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

used bytes: 8388608
total bytes: 16777216

Кажется, что использование памяти графическим процессором остается неизменным во время итерации.

Кстати, есть ли способ избежать этого снижения скорости?

1 Ответ

0 голосов
/ 01 февраля 2019

Это проблема очереди ядра CUDA.

См. Следующее:

Короткое выполнение, наблюдаемое в вашем коде, было фальшивым, потому что cupy возвращает немедленно , когда очередь не заполнена.

Фактическая производительность была последней строкой.

Примечание: Это НЕ было проблемой выделения памяти - как я изначально предлагал в своем первоначальном ответе - но я включаю здесь оригинальный ответ для записи.


Оригинальный (неправильный) ответ

Может быть из-за перераспределения.

Когда вы import cupy, Cupy выделяет "некоторое монтирование" памяти GPU Когда Кьюби использовал их все, ему пришлось выделить больше памяти. Это увеличивает время выполнения.

...