使用gpuR进行整数除法

时间:2017-05-22 20:56:38

标签: r parallel-processing gpu

我尝试使用自定义函数计算大距离矩阵。为了加速这个计算,我试图将所有计算放在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

有没有人有解决方法呢?

1 个答案:

答案 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)出错:当前未实现的整数

但我们可以将AB从整数转换为数字,内部产品可以在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个对象中转换BgpuMatrix个整数矩阵,我们就不会收到来自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

希望这可以帮到你。