【问题标题】:Alea GPU - Passing structures of arraysAlea GPU - 传递数组结构
【发布时间】:2018-01-09 17:37:38
【问题描述】:

我有一个简单的问题。是否可以用 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];
[...]

这在没有结构的情况下工作,但在封装时会产生非法地址。

提前致谢

[edit #1] 似乎 Ptr 副本在此处,好像我尝试将它们从结构中直接传递到内核签名中,错误是相同的。

[edit #2] 也许这是一个非常明显的问题,我尝试直接传递 DeviceMemory 但无法设置值。我将保留“一个数组版本的一个参数”,因为它并不重要,并且总体上得到了一个非常有效的算法。只是想了解更多关于 Alea.Gpu C# 的信息。

【问题讨论】:

标签: aleagpu


【解决方案1】:

参见上面的评论。阵列一切正常。 :)

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2013-03-16
    • 2019-03-03
    • 2016-07-28
    相关资源
    最近更新 更多