在cudafy.net中传递一个Struct给内核

本文关键字:一个 Struct 内核 net cudafy | 更新日期: 2023-09-27 18:19:04

我有一些问题分配结构,其中包含几个数组,到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);
    }
    //.....
}

在cudafy.net中传递一个Struct给内核

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

相关文章: