Почему мой графический процессор медленнее процессора при матричных операциях?

ЦП: i7-9750 @ 2,6 ГГц (с оперативной памятью DDR4 16 ГБ); Графический процессор: Nvidia Geforce GTX 1600 TI (6G); ОС: Windows 10-64 бит

Я попытался увидеть, насколько быстро GPU выполняет базовые матричные операции по сравнению с CPU, и в основном следил за этим https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-Fast-4b920dda1f56. Ниже приведен мой супер простой код.

import numpy as np
import cupy as cp
import time

### Numpy and CPU
s = time.time()
A = np.random.random([10000,10000]); B = np.random.random([10000,10000])
CPU = np.matmul(A,B); CPU *= 5
e = time.time()
print(f'CPU time: {e - s: .2f}')

### CuPy and GPU
s = time.time()
C= cp.random.random([10000,10000]); D = cp.random.random([10000,10000])
GPU = cp.matmul(C,D); GPU *= 5
cp.cuda.Stream.null.synchronize()  
# to let the code finish executing on the GPU before calculating the time
e = time.time()
print(f'GPU time: {e - s: .2f}')

Как ни странно, он показывает время ЦП: 11,74 время графического процессора: 12,56

Это меня действительно смущает. Как GPU может быть даже медленнее CPU при операциях с большими матрицами? Обратите внимание, что я даже не применял параллельные вычисления (я новичок и не уверен, откроет ли система его для меня или нет). Я проверял аналогичные вопросы, такие как Почему мой процессор вместо этого выполняет матричные операции быстрее, чем графический процессор?. Но здесь я использую cupy, а не mxnet (cupy новее и предназначен для вычислений на GPU).

Может кто поможет? Я буду очень признателен!


person QuestionStudent    schedule 18.10.2020    source источник
comment
Я подозреваю, что случайные операции могут быть узким местом.   -  person Klaus D.    schedule 18.10.2020
comment
@ Klaus D. ну, вы можете скопировать и вставить код, запустить на своем компьютере и посмотреть результат. Думаю, похоже. Я не знаю, связано ли это с тем, что моя память графического процессора слишком мала (всего 6 ГБ; для сравнения, оперативная память - 16 ГБ DDR4). Я просто очень смущен результатами в таком чрезвычайно простом примере.   -  person QuestionStudent    schedule 18.10.2020
comment
Также имейте в виду, что при выполнении первого вычисления GPU в процессе (C= cp.random.random([10000,10000]) в вашем примере) произойдет инициализация контекста CUDA, которая может занять несколько секунд.   -  person kmaehashi    schedule 18.10.2020


Ответы (1)


numpy random по умолчанию генерирует числа с плавающей запятой (32 бит). Cupy random по умолчанию генерирует 64-битное (двойное) значение. Чтобы сравнить яблоки с яблоками, измените генерацию случайных чисел GPU следующим образом:

C= cp.random.random([10000,10000], dtype=cp.float32)
D = cp.random.random([10000,10000], dtype=cp.float32)

У меня другое оборудование (ЦП и ГП), чем у вас, но после внесения этого изменения версия ГП примерно в 12 раз быстрее, чем версия ЦП. Генерация ndarray случайных чисел, матричное умножение и скалярное умножение с использованием Cupy занимает в общей сложности менее одной секунды

person Stripedbass    schedule 18.10.2020
comment
В этом есть смысл. Я модифицировал его и запускал на том же компьютере. Новые результаты: Время ЦП: 12,27 Время ГП: 1,09. Большое спасибо! - person QuestionStudent; 19.10.2020