Операции `vclMatrix` в пакете` gpuR` выполняются лениво? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь выполнить тесты производительности на моей машине, чтобы узнать, нужно ли мне выполнять какие-то вычисления на 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, чтобы избежать затрат на передачу данных между хостом и устройством.

...