2017-05-22 12 views
1

私はカスタム関数を使って大距離行列を計算しようとしています。この計算を高速化するために、私はすべての計算をGPUに入れようとしています。私が実行している計算の一部は、次のように再現できるエラーになります。gpuRを使った整数除算

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

github [ここ](https://github.com/cdeterman/gpuR/issues)でリクエストを行うことは大歓迎です。そうすれば、私は確かにこれを可能にすることができます。 Rの整数除算も '%/%'演算子で行われます。 – cdeterman

答えて

1

ここに、解決策を示す例があります。
整数の2つのベクトルの積は、現在実装されていません。

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 

興味深いメモ。我々はgpuMatrixオブジェクトに整数のAB行列を変換する場合、我々は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 

ホープこれはあなたを助けることができます。

+0

現在のバージョンの良い説明。私はちょうどここにあなたの答えと注目されている乗算のバグに気づいた。この問題は[こちら](https://github.com/cdeterman/gpuR/issues/86)で文書化されており、githubの 'develop'バージョンで修正されました。 – cdeterman