Почему графический процессор медленнее, чем процессор при выполнении SVD на массиве с двойной задачей?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему графический процессор медленнее, чем процессор при выполнении SVD на массиве с двойной задачей?

Сообщение Anonymous »

Я получаю одинаковые результаты как в Джулии, так и в Python. Разложение в единственном значении на графическом процессоре медленнее, чем на процессоре для массивов Float64. (Массивы float32 ведут себя так, как можно ожидать, с быстрее графического процессора.) -Верд ">

Код: Выделить всё

import time
import torch
from torch.linalg import svd

f64 = torch.double
f32 = torch.float

cpu = torch.device("cpu")
gpu = torch.device("cuda")

# X = torch.rand(5_000, 10_000, dtype=f32)
X = torch.rand(5_000, 10_000, dtype=f64)

X_cpu = X.to(cpu)
X_gpu = X.to(gpu)

print(X_cpu.type())
# Warmup
U, Sig, Vt = svd(X_cpu, full_matrices = True)
# Timed run (CPU)
t1 = time.perf_counter()
U, Sig, Vt = svd(X_cpu, full_matrices = True)
t2 = time.perf_counter()
print(U.type())

print(X_cpu.type())
# Warmup
U, Sig, Vt = svd(X_gpu, full_matrices = True)
# Timed run (GPU)
t3 = time.perf_counter()
U, Sig, Vt = svd(X_gpu, full_matrices = True)
t4 = time.perf_counter()
print(U.type())

print(f"Time CPU (s): {t2-t1}")
print(f"Time GPU (s): {t4-t3}")
< /code>
Для приведенного выше массива float64 I Get: < /p>
Time CPU (s): 14.52491476599971
Time GPU (s): 56.79755901500175
< /code>
Если я использую массив Float32 вместо этого, я получаю гораздо более разумный вид: < /p>
Time CPU (s): 9.301500292000128
Time GPU (s): 6.969021153003268
< /code>
Хотя все же немного удивительно, что использование графического процессора ускоряет вещи только на пару секунд. < /p>
Код Юлии дает аналогичные результаты: < /p>
using LinearAlgebra
using Flux
using CUDA
using cuDNN

X = rand(5_000, 10_000)
println("typeof(X): $(typeof(X))")
# Warmup
U, Sig, V = LinearAlgebra.svd(X)
# Timed run
t1 = time_ns()
U, Sig, V = LinearAlgebra.svd(X)
t2 = time_ns()

println("typeof(U): $(typeof(U))")

X_gpu = X |> gpu |> f64
println("typeof(X_gpu): $(typeof(X_gpu))")

# Warmup
U, Sig, V = CUDA.svd!(X_gpu)
# Timed run
t3 = time_ns()
U, Sig, V = CUDA.svd!(X_gpu)
t4 = time_ns()
println("typeof(U): $(typeof(U))")

println("Time CPU (s): $((t2-t1)/1e9)")
println("Time GPU (s): $((t4-t3)/1e9)")
< /code>
Для этого массива float64 GPU снова занимает гораздо больше времени, чем процессор: < /p>
Time CPU (s): 28.641290506
Time GPU (s): 57.069009417
< /code>
Тем не менее, переход на Float32 снова дает разумный результат: < /p>
Time CPU (s): 15.096364932
Time GPU (s): 7.283513658
< /code>
Два вопроса: < /p>
[list]
[*] Почему массивы Float64 так плохо работают на GPU? Я использую графический процессор серии NVIDIA 40, если это актуально. (Особенно для массивов Float64, но ускорение SVD для массивов Float32 также было бы хорошим.) Одним из возможных способов будет изменение того, как выполняется SVD. Я проверил, и, похоже, нет никаких дополнительных аргументов, доступных для функции SVD CUDA.JL. Я попытался установить full_matrices = false 
для функции SVD от Pytorch, но я получил те же результаты.
[/list]

Подробнее здесь: https://stackoverflow.com/questions/794 ... cision-arr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»