2017-08-14 7 views
0

私は簡単な質問があります。 Alea.Gpuでこのような配列の構造体を書くことは可能ですか?Alea GPU - 配列の構造体を渡す

 public struct SVDFactorsStructGpu 
     { 
      public deviceptr<float> ItemsBiases; 
      public deviceptr<float> UsersBiases; 
      public deviceptr<float> ItemsFeatures; 
      public deviceptr<float> UsersFeatures; 
     } 
[...] 
     SVDFactorsStructGpu factors = new SVDFactorsStructGpu(); 
     factors.ItemsBiases = gpuItemsBiases.Ptr; 
     factors.UsersBiases = gpuUsersBiases.Ptr; 
     factors.ItemsFeatures = gpuItemsFeatures.Ptr; 
     factors.UsersFeatures = gpuUsersFeatures.Ptr; 
[...] 

とカーネルに何とかこのようにそれらを渡す:

public void TrainEpochKernel(SVDParamsStructGpu svdParams, 
           deviceptr<float> ratings, 
           deviceptr<int> ratingsItemsIds, 
           deviceptr<int> userProfilesIds, 
           deviceptr<int> ratingsStartIdxs, 
           deviceptr<int> ratingsCounts, 
           deviceptr<float> userProfilesSSE, 
           SVDFactorsStructGpu factors) 
    { 
     int startUserProfileIdx = blockIdx.x * (blockDim.x * svdParams.StridePerThread) + threadIdx.x * svdParams.StridePerThread; 

[...] 
       pred = svdParams.GlobalMean; 
       pred += factors.ItemsBiases[i]; 
       pred += factors.UsersBiases[u]; 
[...] 

これは構造なしで動作しますが、カプセル化されたときに、不正なアドレスを生成します。事前に

おかげで

[編集#1]私がエラーが同じであるカーネルの署名に直接構造からそれらを渡すためにしようとしているかのようのPTRコピーは、ここに原因であると思われます。

[編集#2] DeviceMemory <を直接渡してみましたが、値を設定できませんでした。私は "1つの配列バージョンの1つのパラメータ"を重要な問題ではなく、全体として非常に効率的なアルゴリズムを持っているので、そのまま使用します。 Alea.Gpu C#についてもっと知りたいのは興味がありました。

+0

情報については、QuantAlea GPUは、次の資料に使用された: https://www.linkedin.com/pulse/azure-batch-hpc-learning-20-million-ratings-seconds-c%C3 %A9dric-dell%C3%A9a よろしく –

答えて

0

Cf、上記のコメント。すべてが配列でうまくいった。 :)

関連する問題