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#的信息。
有關信息,QuantAlea GPU用於以下文章: https://www.linkedin.com/pulse/azure-batch-hpc-learning-20-million-ratings-seconds-c%C3 %A9dric-dell%C3%A9a Regards –