【问题标题】:Passing a Struct to a kernel in cudafy.net将结构传递给 cudafy.net 中的内核
【发布时间】:2013-06-18 14:33:18
【问题描述】:

我在将包含多个数组的结构分配给 GPU 时遇到了一些问题。在第二个代码块中,我遇到了一个错误:

SimpleDataStructure[] dev_SDS = _gpu.CopyToDevice(SDS);

有人知道为什么吗?从我可以看到 CopyToDevice() 不支持将结构作为参数。不过,我可能会遗漏一些东西,所以无论如何都希望能得到一些帮助。

结构声明:

[Cudafy]
public struct SimpleDataStructure
{
    public float[] AreaCode;
    public float[] Number; 

    public SimpleDataStructure(int x)
    {
        AreaCode = new float[x];
        Number = new float[x];
    }
}

我的班级方法中的代码:

Public class TaskManager
{
    private static GPGPU _gpu;

    private SimpleDataStructure SDS;

    public void PreparationForTasks()
    {
        DataRetrieval();

        SDS = new SimpleDataStructure(_entity.Data.Count - 1);

        CudafyModule km = CudafyTranslator.Cudafy();            
        _gpu = CudafyHost.GetDevice(eGPUType.Cuda);
        _gpu.LoadModule(km);

        //Loaded SimpleDataStructure into same module.
        km = CudafyTranslator.Cudafy(typeof(SimpleDataStructure));
        _gpu.LoadModule(km, false);

//Getting error on following line.
        SimpleDataStructure[] dev_SDS = _gpu.CopyToDevice(SDS);

        dim3 grid = new dim3(10, 10, 1);
        dim3 block = new dim3(8, 8, 1);
        _gpu.Launch(grid, block, "WorkerKernelOnGPU", dev_SDS);

        SimpleDataStructure result_SDS = new SimpleDataStructure(100);

        _gpu.CopyFromDevice(dev_SDS, result_SDS);
    }

    //.....
}

【问题讨论】:

    标签: c# cuda cudafy.net


    【解决方案1】:

    你不能将数组引用作为你的结构的成员,这是 cudafy 不支持的。您可以通过自己将数组复制到设备并将设备地址作为 IntPtrs 存储在结构中来解决此问题。或者,如果要固定数组的大小,您可以使您的结构不安全并在结构内使用固定大小的数组。

    【讨论】:

    • 你能用你的第二种方法和 IntPtrs 写一个简单的例子吗?关于第一种方法,在我的示例中,我只是将 AreaCode 和 Number 作为单独的参数传递给我的内核?感谢您迄今为止的帮助。 +1。
    • @HansRudel 关于 struct 中数组的可能解决方案,我建议您参考以下讨论:cudafy.codeplex.com/discussions/283527 查看您的代码,当您可以简单地传递两个数组并避免时,使用 struct 似乎有点过头了整个结构与数组的混乱。
    • 感谢您的帮助 + 是的,您可能是对的。当事情变得更复杂时,我会看到如何实现 struct 版本。
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2018-06-02
    相关资源
    最近更新 更多