C# Alea Gpu可以只复制数组中的最后一个元素吗?

C# Alea Gpu可以只复制数组中的最后一个元素吗?,c#,aleagpu,C#,Aleagpu,我正在使用Alea GPU在GPU上使用C语言编程。在我的项目中,我想在GPU上减少数组中的所有零元素,因此我计划使用独占和扫描来实现它。下一步是我必须得到扫描结果的最后一个元素,以便在算法中找到所有非零元素。在这一步中,我不想将所有结果复制到主机,因为这非常昂贵,但我找不到一种方法来提取最后一个元素而不复制所有元素(也许有一种方法我不知道?) 这是我扫描部分的代码d_VoxeOccess是设备上的sprase阵列。如何获取d_voxeOccupyScan的最后一个元素 var op =

我正在使用Alea GPU在GPU上使用C语言编程。在我的项目中,我想在GPU上减少数组中的所有零元素,因此我计划使用独占和扫描来实现它。下一步是我必须得到扫描结果的最后一个元素,以便在算法中找到所有非零元素。在这一步中,我不想将所有结果复制到主机,因为这非常昂贵,但我找不到一种方法来提取最后一个元素而不复制所有元素(也许有一种方法我不知道?)

这是我扫描部分的代码d_VoxeOccess是设备上的sprase阵列。如何获取d_voxeOccupyScan的最后一个元素

    var op = new Func<int, int, int>((a, b) => { return a + b; });
    Alea.Session session = new Alea.Session(gpu);
    var d_voxeOccupyScan = gpu.Allocate<int>(numVoxels);
    GpuExtension.Scan<int>(session, d_voxeOccupyScan, d_voxeOccupy, 0, op, 0);
var op=newfunc((a,b)=>{返回a+b;});
Alea.Session Session=新的Alea.Session(gpu);
var d_voxeOccupyScan=gpu.Allocate(numVoxels);
GpuExtension.Scan(会话,d_voxeOccupyScan,d_voxeoccupt,0,op,0);
==更新===

我举了一个例子来清楚地解释这个问题

        static void Main(string[] args)
        {
            int[] arrayA = new int[14]{ 0, 0, 3, 0, 0, 6, 0, 9, 0, 12, 0, 0, 0, 15 };

            var gpu = Gpu.Default;
            var op = new Func<int, int, int>((a, b) => { return a + b; });
            Alea.Session session = new Alea.Session(gpu);
            var d_voxeOccupyScan = gpu.AllocateDevice<int>(14);
            var d_voxeOccupy = gpu.AllocateDevice<int>(arrayA);
            GpuExtension.Scan<int>(session, d_voxeOccupyScan.Ptr, d_voxeOccupy.Ptr, 0, 14,op, 0);

            var result = Gpu.CopyToHost(d_voxeOccupyScan);
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
static void Main(字符串[]args)
{
int[]arrayA=newint[14]{0,0,3,0,0,6,0,9,0,12,0,0,0,0,15};
var gpu=gpu.Default;
var op=newfunc((a,b)=>{返回a+b;});
Alea.Session Session=新的Alea.Session(gpu);
var d_voxeOccupyScan=gpu.AllocateDevice(14);
var d_VoxeOccess=gpu.AllocateDevice(arrayA);
GpuExtension.Scan(会话,d_voxeOccupyScan.Ptr,d_voxeOccupy.Ptr,0,14,op,0);
var result=Gpu.copytoost(d_voxeOccupyScan);
foreach(结果中的var项目)
{
控制台写入线(项目);
}
Console.ReadKey();
}

运行这段代码,我们将得到一个数组,最后一个元素是45。如何从该数组中提取最后一个元素而不是复制所有元素?

我怀疑这无关紧要:完成计算和设置卡以传输回数据的开销将远远大于传输其余数组的额外时间。但这是一个有趣的问题,应该是可能的。嗨,Rup,实际上我已经设置了gpu的网格和线程。这个问题是我计划中的一个步骤,非常必要。现在这个问题暂时解决了,因为我已经把我的编程语言转换成C++/CUDA,但我希望C#/Alea中的这个问题也能尽快解决。我怀疑这无关紧要:完成计算和设置卡以传输回数据的开销将远远大于传输阵列其余部分的额外时间。但这是一个有趣的问题,应该是可能的。嗨,Rup,实际上我已经设置了gpu的网格和线程。这个问题是我计划中的一个步骤,非常必要。现在这个问题已经暂时解决了,因为我已经把我的编程语言转换成了C++/CUDA,但是我希望C++中的这个问题也可以尽快解决。