Alea GPU - 传递数组结构
Alea GPU - Passing structures of arrays
我有一个简单的问题。是否可以使用 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 副本是这里的原因,就好像我试图从结构中直接在内核签名中传递它们一样,错误是一样的。
[edit #2] 也许这是一个非常明显的问题,我尝试直接传递 DeviceMemory<> 但无法设置值。我将保留 "one parameter for one array version" 因为它并不重要并且总体上得到了一个非常有效的算法。只是想知道更多关于 Alea.Gpu C# 的信息。
cf,评论在上面。阵列一切正常。 :)
我有一个简单的问题。是否可以使用 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 副本是这里的原因,就好像我试图从结构中直接在内核签名中传递它们一样,错误是一样的。
[edit #2] 也许这是一个非常明显的问题,我尝试直接传递 DeviceMemory<> 但无法设置值。我将保留 "one parameter for one array version" 因为它并不重要并且总体上得到了一个非常有效的算法。只是想知道更多关于 Alea.Gpu C# 的信息。
cf,评论在上面。阵列一切正常。 :)