我尝试使用自定义函数计算大距离矩阵。为了加速这个计算,我试图将所有计算放在GPU上。我执行的计算的一部分会遇到错误,可以按如下方式重现:
require('gpuR')
a=gpuVector(c(5,4,3,6,7),type='integer')
d=a/2
Error in gpuVecScalarDiv(e1, e2, 0) : integer not currently implemented
有没有人有解决方法呢?
答案 0 :(得分:1)
这是一个应该表明可能的解决方案的例子 目前尚未实现两个整数向量的乘积:
library(gpuR)
A <- seq.int(from=0, to=999)
B <- seq.int(from=1000, to=1)
gpuA <- gpuVector(A)
gpuB <- gpuVector(B)
gpuC <- gpuA %*% gpuB
gpuVecInnerProd(x,y)出错:当前未实现的整数
但我们可以将A
和B
从整数转换为数字,内部产品可以在gpuR
下很好地运作:
A <- as.numeric(seq.int(from=0, to=999))
B <- as.numeric(seq.int(from=1000, to=1))
gpuA <- gpuVector(A)
gpuB <- gpuVector(B)
gpuC <- gpuA %*% gpuB
all(A%*%B == gpuC)
[1] TRUE
在你的例子中:
a <- gpuVector(c(5,4,3,6,7)*1.0)
d <- a/2
d[,]
[1] 2.5 2.0 1.5 3.0 3.5
一个有趣的说明。如果我们在A
个对象中转换B
和gpuMatrix
个整数矩阵,我们就不会收到来自gpuA %*% gpuB
的错误消息,但结果是错误的:
A <- matrix(seq.int(from=0, to=999),nrow=1)
B <- matrix(seq.int(from=1000, to=1),ncol=1)
gpuA <- gpuMatrix(A)
gpuB <- gpuMatrix(B)
print(gpuA)
Source: gpuR Matrix [1 x 1,000]
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 2 3 4
print(gpuB)
Source: gpuR Matrix [1,000 x 1]
[,1]
[1,] 1000
[2,] 999
[3,] 998
[4,] 997
[5,] 996
gpuC <- gpuA %*% gpuB
print(gpuA %*% gpuB)
Source: gpuR Matrix [1 x 1]
[,1]
[1,] 0
print(A%*%B)
[,1]
[1,] 166666500
希望这可以帮到你。