Я пытаюсь выполнить тесты производительности на моей машине, чтобы узнать, нужно ли мне выполнять какие-то вычисления на GPU или нет. Когда я запускаю этот скрипт:
library(gpuR)
library(tictoc)
N = 512
A = matrix(rnorm(N^2), nrow=N)
B = matrix(rnorm(N^2), nrow=N)
C = A %*% B
gpuA = vclMatrix(A, type="double")
gpuB = vclMatrix(B, type="double")
tic() ; gpuC = gpuA %*% gpuB ; toc()
... что на самом деле происходит? Производится ли умножение матриц на самом деле? Я подозреваю, что не потому, что для запуска * ~ 1004 * требуется впечатляюще мало времени (~ 0,01 с), и оно не меняется с N.
Кроме того, если я пытаюсь проверить, если C==gpuC
, я получу ошибка (comparison (1) is possible only for atomic and list types
), и если я попытаюсь изменить код следующим образом, чтобы выполнить сравнение на графическом процессоре:
N = 512
A = matrix(rnorm(N^2), nrow=N)
B = matrix(rnorm(N^2), nrow=N)
C = A %*% B
gpuA = vclMatrix(A, type="double")
gpuB = vclMatrix(B, type="double")
gpuC = vclMatrix(C, type="double")
# gpuC == gpuA %*% gpuB # fails
... Я получаю ту же ошибку.
Я, конечно, могу перенести данные из графического процессора в память с помощью as.matrix()
, но я не понимаю, связано ли время, затраченное на эту операцию, с 1. ленивым умножением матрицы или 2. переносом из графического процессора в саму память. В реальном приложении я выполняю последовательные операции на графическом процессоре, пока не получу небольшой вектор для возврата, но прежде чем я получу, я хотел бы понять, какое ускорение я могу получить здесь.
Последнее, но не менее важное Я понял из чтения, что больше не могу найти, что по сравнению с gpuMatrix
, vclMatrix
был своего рода оптимизирован для передачи из памяти в GPU и эффективно перемещал данные по частям. Но я явно что-то не так понял. К сожалению, документация довольно скудная и не настолько прозрачная для меня:
Этот класс указывает на память непосредственно на GPU, чтобы избежать затрат на передачу данных между хостом и устройством.