3

複数の配列を含む構造体を GPU に割り当てる際に問題が発生しています。2番目のコードブロックで、次のエラーが発生します。

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);
    }

    //.....
}
4

1 に答える 1

5

配列参照を構造体のメンバーとして持つことはできません。これは cudafy でサポートされていません。これを回避するには、配列を自分でデバイスにコピーし、デバイス アドレスを IntPtrs として構造体内に格納します。あるいは、配列のサイズが固定される場合は、構造体を安全でなくして、構造体内で固定サイズの配列を使用することができます。

于 2013-06-18T15:22:09.187 に答える