2017-08-14 74 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副本是在這裏的原因,因爲如果我嘗試從結構直接轉給內核簽名的錯誤是一樣的。可能這是一個非常明顯的問題,我試圖直接傳遞DeviceMemory <>,但無法設置值。我將保留「一個陣列版本的一個參數」,因爲它並不重要,總體上得到了非常有效的算法。只是想知道更多關於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 Regards –

回答

0

參考,上面評論。一切工作正常與陣列。 :)