Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FR]: 关于webgpu模拟双精度问题 #141

Open
GGBond-GIS opened this issue May 12, 2023 · 10 comments
Open

[FR]: 关于webgpu模拟双精度问题 #141

GGBond-GIS opened this issue May 12, 2023 · 10 comments
Assignees
Labels
wait Wait for further info

Comments

@GGBond-GIS
Copy link

WebGIS大地坐标系统

在常规的gis引擎中需要双精度来准确的描述地理信息,在webgpu中没有双精度;
在低级别中对精度要求不高的情况:
image
在高级别中对精度要求较高的情况:
image

@GGBond-GIS GGBond-GIS added the feature New feature or request label May 12, 2023
@lslzl3000
Copy link
Collaborator

lslzl3000 commented May 12, 2023

这个可以去 webgpu 的 repo 反馈,按照目前 webgpu 的社区反馈可能暂时不会规划支持,主要是一些设备和平台不支持64位双精度浮点数,作为一个统一的web的标准,webgpu 官方尽量想规避因为设备和系统带来的差异,但未来是有可能以extension的形式支持
我们目前也在观望,暂时不打算对这部分做支持,通过算法模拟双精度性能不会太好,而且额外的gpu消耗也非常大
比起在webgpu层面支持双精度,通过应用层面去处理精度问题更灵活一些。一些常用的处理方案可以有效规避数据抖动和精度问题,比如:

  1. 由 js 统一处理成float32再传入wgsl 可以有效消除数据抖动的问题;
  2. 手动将float64转换成2个float32来存储
  3. 对于gis类应用,可以引入相对偏差数值/offset 数据作为参考系,一个f32数据足以表达精度

这个 issues 可以保持 open,看看 webgpu 未来支持情况如何

@lslzl3000 lslzl3000 added wontfix This will not be worked on and removed feature New feature or request labels May 12, 2023
@JingwenBai JingwenBai added wait Wait for further info and removed wontfix This will not be worked on labels May 12, 2023
@JingwenBai
Copy link
Collaborator

这个问题很多人都有反馈过,而且也应该是有一些解决方案的。目前来看最好的办法是webgpu官方来支持这种特性。不过针对于我们的场景,应该是可以有一些特定的解决方法的。

咱们是否可以更详细的描述一下具体使用场景和需求,哪些功能必须要双精度来支持,如果没有双精度会出现什么样的问题。我们可以针对具体的问题,再做进一步分析和讨论~

目前单纯从issue中的截图效果来看,世界地图的精度下,可以正常显示地图信息。但是到了街道地图的精度下,所有的道路和建筑边缘会因为精度不够的问题,造成了边缘“弯曲”的效果。不知道是否这样理解呢?

@lslzl3000
Copy link
Collaborator

lslzl3000 commented May 13, 2023

这个问题很多人都有反馈过,而且也应该是有一些解决方案的。目前来看最好的办法是webgpu官方来支持这种特性。不过针对于我们的场景,应该是可以有一些特定的解决方法的。

咱们是否可以更详细的描述一下具体使用场景和需求,哪些功能必须要双精度来支持,如果没有双精度会出现什么样的问题。我们可以针对具体的问题,再做进一步分析和讨论~

目前单纯从issue中的截图效果来看,世界地图的精度下,可以正常显示地图信息。但是到了街道地图的精度下,所有的道路和建筑边缘会因为精度不够的问题,造成了边缘“弯曲”的效果。不知道是否这样理解呢?

gis中渲染的都是一个一个瓦片/格子,由于js里是f64双精度数据,直接传入gpu计算会造成精度丢失,造成每个瓦片/格子位置发生轻微错位,大地图上精度不高,丢失了也基本看不出来,但缩放级别高了,一点点精度就比较明显了,会出现渲染抖动和错位

所谓模拟f64,可以牺牲显存,将f64转换成2个f32来存储传入gpu,除此之外还需要配合额外wgsl算法去实现用2个高低位f32计算f64的过程,性能和显存消耗都比较大

比起这种模拟形式,我上面回复也提到了,这个问题可以通过js层面统一先处理成f32后再传入gpu,可以有效避免抖动和错位问题

如果要求精度不丢失,可以通过在js应用层面先将gis坐标处理成一种相对差值坐标系,就是每个瓦片只传递相对位置差值,这样一个f32的精度也足够表达原始f64的位置信息

@JingwenBai
Copy link
Collaborator

JingwenBai commented May 13, 2023

内部讨论的结果是,引擎层次可以针对于类似于GIS的场景或者其他对于数字精度要求比较高,以及大数场景做一些特殊的能力支持。

我们需要更多的时间来评估,用什么方案来处理更加合理,也总结出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现提高精度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

@GGBond-GIS
Copy link
Author

GGBond-GIS commented May 15, 2023

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。

我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种
https://prideout.net/emulating-double-precision
image

lslzl3000 added a commit that referenced this issue May 15, 2023
@lslzl3000
Copy link
Collaborator

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。
我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种 https://prideout.net/emulating-double-precision image

ok,这个例子就是在 shader 里做 f64 的拼接处理,把一个 f64 处理成两个高低位 f32 来做拼接运算,您是希望能用 wgsl 来做一个类似处理是吗?

@GGBond-GIS
Copy link
Author

内部讨论的结果是,引擎层次可以针对类于GIS的场景或者其他者针对数字精度要求比更高,以及大数据场景做一些特殊的能力支持。
我们需要更多的时间来评价,用什么方法来处理更合理,也总得出了以下方法,大家可以多给建议:

  1. JS层做坐标系转换,通过差值的方式来实现现代提高度的效果
  2. JS层统一把64位精度全部转换成32位精度
  3. 在WGSL层做拼接计算处理

是否可以提供一个demo类似这种 https://prideout.net/emulating-double-precision image

ok,这个例子就是在 shader 里做 f64 的拼接处理,把一个 f64 处理成两个高低位 f32 来做拼接运算,您是希望能用 wgsl 来做一个类似处理是吗?

是的我希望有一个orillusion做的demo

@github-project-automation github-project-automation bot moved this to 📋 Backlog in Engine May 17, 2023
@X-OldGentleMan X-OldGentleMan moved this from 📋 Backlog to 🔨Todo in Engine May 30, 2023
@X-OldGentleMan X-OldGentleMan moved this from 🔨Todo to 🏗 In progress in Engine May 30, 2023
@Noah133552 Noah133552 moved this from 🏗 In progress to 🔨Todo in Engine Jun 25, 2023
@github-project-automation github-project-automation bot moved this from 🔨Todo to ✅ Done in Engine Dec 17, 2024
@Davidyanlong
Copy link

@Davidyanlong
Copy link

一些地图使用泰勒展开式

@orillusion-admin
Copy link
Contributor

精度问题是一个我们一直关注的问题,正在尝试不同方式解决,希望持续讨论!

@github-project-automation github-project-automation bot moved this from ✅ Done to 🔨Todo in Engine Dec 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
wait Wait for further info
Projects
Status: 🔨Todo
Development

No branches or pull requests

6 participants