我正在使用 Alea GPU 使用 C# 语言在 GPU 上编程。在我的项目中,我想减少 GPU 上数组中的所有零元素,因此我计划使用独占和扫描来实现它。下一步是我必须获取扫描结果的最后一个元素,以便在算法中找到所有非零元素。在这一步中,我不想将所有结果复制到主机,因为它非常昂贵,但是我没有找到一种方法可以在不复制所有元素的情况下提取最后一个元素(也许有一种我不知道的方法?) .
这是我的扫描部分的代码。d_voxeOccupy是设备上的一个 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);
===更新===
我做了一个例子来清楚地解释这个问题。
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();
}
运行这段代码,我们会得到一个数组,最后一个元素是45。如何从这个数组中提取最后一个元素而不是复制所有元素?