Microsoft Accelerator比C#中的串行实现更慢

时间:2012-09-19 06:58:30

标签: c# gpu simulation gpgpu accelerator

我在业余时间用C#编写了这个时髦的小型2D机身模拟。它在串行实现方面运行良好,以高达约1000个帧的良好帧速率运行,此时它开始滞后。

我修改了算法,在单独的块中进行位置和速度更新,以便在CPU的不同内核上运行,我发现性能有了很小的提升。

请注意,大部分时间花在实际数学上,并且花费了一些时间来实际绘制场景。

我刚刚下载了Microsoft Accelerator V2库,并从头开始重写整个代码以使用它。它像以前一样工作,但速度明显变慢!然而,在我能够获得近1000分的顺利运行之前,我现在只能在加速器下获得大约10分。

Here是我的代码。这是我第一次使用Accelerator做任何事情,所以我很可能已经搞砸了。

该类名为Test,因为这是我的第一次测试。构造函数只是为物体的x和y位置创建长度为n的数组,它们的x和y速度以及它们的质量。 dec只是一个阻尼因子,因此舍入误差会使其内爆而不是爆炸,而g只是我刚刚在1.0f离开的引力常数。

Tick()是执行所有更新的函数。我首先考虑关于任何给定点i的所有点,找到半径,在其他点的方向上构造单位向量,通过减速度和重力常数来缩放单位向量,然后求和到x和y速度更新为此。

然后我更新所有速度和所有位置,然后转换回float[] s。

正如我所说,代码在技术上有效。除了大规模的减速之外,结果与我的串行实现相同。

任何想法我可能做错了什么?

我感觉它可能是第85行和第86行 - 我正在将第i点的x和y速度更新相加,并将其存储到我的浮点数组中,这意味着我需要调用{{1}获得总和值。

我这样做的原因是我首先获得所有点的更新,然后我更新点,然后根据速度应用位置变化。

即。我不希望在时间 t + 1 的情况下,我用 t 的其余点更新点 0 ,然后下一个在时间 t 处再次使用其余点更新点 1 ,但使用新的 t + 1 指向0。如果这是有道理的。

Target.ToArray1D()[0]

1 个答案:

答案 0 :(得分:1)

您应该重新考虑您的逻辑以真正使用并行计算。你仍然在一点点工作。要使用库的优点,您应该考虑对整个元素阵列执行一个操作。