gpt4 book ai didi

c# - 将坐标转换卸载到 GPU

转载 作者:太空狗 更新时间:2023-10-29 21:40:51 25 4
gpt4 key购买 nike

我有一个使用 WinForms 的遗留 map 查看器应用程序。它很慢。 (速度过去是可以接受的,但是谷歌地图、谷歌地球出现了,用户被宠坏了。现在我可以做得更快了:)

在完成所有明显的速度改进(缓存、并行执行、不绘制不需要绘制的内容等)之后,我的分析器告诉我真正的瓶颈是坐标转换当将点从 map 空间转换为屏幕空间。通常转换代码如下所示:

    public Point MapToScreen(PointF input)
{
// Note that North is negative!
var result = new Point(
(int)((input.X - this.currentView.X) * this.Scale),
(int)((input.Y - this.currentView.Y) * this.Scale));
return result;
}

真正的实现比较棘手。纬度/经度表示为整数。为避免精度下降,将它们乘以 2^20(约 100 万)。这就是坐标的表示方式。

public struct Position
{
public const int PrecisionCompensationPower = 20;
public const int PrecisionCompensationScale = 1048576; // 2^20
public readonly int LatitudeInt; // North is negative!
public readonly int LongitudeInt;
}

重要的是,可能的比例因子也明确绑定(bind)到 2 的幂。这使我们能够用移位替换乘法。所以真正的算法是这样的:

    public Point MapToScreen(Position input)
{
Point result = new Point();
result.X = (input.LongitudeInt - this.UpperLeftPosition.LongitudeInt) >>
(Position.PrecisionCompensationPower - this.ZoomLevel);
result.Y = (input.LatitudeInt - this.UpperLeftPosition.LatitudeInt) >>
(Position.PrecisionCompensationPower - this.ZoomLevel);
return result;
}

(UpperLeftPosition 表示 map 空间中屏幕的左上角。)我现在正在考虑将此计算卸载到 GPU。谁能举例说明如何做到这一点?

我们使用 .NET4.0,但代码最好也能在 Windows XP 上运行。此外,我们无法使用 GPL 下的库。

最佳答案

我建议您看看使用 OpenCL 和 Cloo要做到这一点 - 看看 vector add example然后将其更改为通过使用两个 ComputeBuffer(每个点对应 LatitudeIntLongitudeInt 一个)将值映射到 2 个输出 ComputeBuffers。我怀疑 OpenCL 代码看起来像这样:

__kernel void CoordTrans(__global int *lat, 
__global int *lon,
__constant int ulpLat,
__constant int ulpLon,
__constant int zl,
__global int *outx,
__global int *outy)
{
int i = get_global_id(0);
const int pcp = 20;

outx[i] = (lon[i] - ulpLon) >> (pcp - zl);
outy[i] = (lat[i] - ulpLat) >> (pcp - zl);
}

但是你会为每个核心做不止一个坐标变换。我需要赶快离开,我建议您在执行此操作之前阅读 opencl。

另外,如果坐标数量合理(<100,000/1,000,000),非基于 GPU 的解决方案可能会更快。

关于c# - 将坐标转换卸载到 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com