Ускорение графического процессора работает путем тяжелого распараллеливания вычислений.На графическом процессоре у вас огромное количество ядер, каждое из которых не очень мощное, но огромное количество ядер здесь имеет значение.
Фреймворки, такие как PyTorch, делают их, чтобы сделать возможным максимально возможное вычисление впараллельно.В общем случае матричные операции очень хорошо подходят для распараллеливания, но распараллеливание вычислений не всегда возможно!
В вашем примере у вас есть цикл:
b = torch.ones(4,4).cuda()
for _ in range(1000000):
b += b
У вас есть 1000000 операций, но из-за структуры кода невозможно распараллелить большую часть этих вычислений.Если вы думаете об этом, чтобы вычислить следующий b
, вам необходимо знать значение предыдущего (или текущего ) b
.
Итак, у вас есть 1000000 операций, но каждая из них должна вычисляться одна за другой.Возможное распараллеливание ограничено размером вашего тензора.Этот размер, однако, не очень большой в вашем примере:
torch.ones(4,4)
Таким образом, вы можете распараллеливать только 16 операций (дополнений) на одну итерацию.Поскольку процессор имеет несколько , но гораздо больше мощных ядер, в данном примере это будет намного быстрее!
Но все изменится, если вы измените размертензор, то PyTorch способен распараллелить гораздо больше общего вычисления.Я изменил итерации на 1000 (потому что я не хотел ждать так долго :), но вы можете указать любое значение, которое вам нравится, соотношение между процессором и графическим процессором должно оставаться прежним.
Вот результаты для разных тензорных размеров:
#torch.ones(4,4) - the size you used
CPU time = 0.00926661491394043
GPU time = 0.0431208610534668
#torch.ones(40,40) - CPU gets slower, but still faster than GPU
CPU time = 0.014729976654052734
GPU time = 0.04474186897277832
#torch.ones(400,400) - CPU now much slower than GPU
CPU time = 0.9702610969543457
GPU time = 0.04415607452392578
#torch.ones(4000,4000) - GPU much faster then CPU
CPU time = 38.088677167892456
GPU time = 0.044649362564086914
Итак, как вы видите, где можно распараллелить вещи (здесь добавление тензорных элементов), GPU становится очень мощным.
Время GPU не изменяется для данных расчетов, GPU может обрабатывать гораздо больше!
(до тех пор, пока памяти не хватит:)