2017-08-14 56 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

参考,上面评论。一切工作正常与阵列。 :)