使用HTML5 WebGL着色器进行计算



在我看来,理论上可以使用WebGL进行计算-例如计算素数或π或类似的东西。然而,从我所看到的一点点,着色器本身不是用Javascript编写的,所以我有几个问题:

  1. 着色器是用什么语言写的?
  2. 考虑到着色器的工作方式,尝试做这样的事情是否值得?
  3. 在运行时如何来回传递变量?或者如果不可能的话,如何在着色器完成执行后传递信息?
  4. 既然它不是Javascript,如何处理非常大的整数(Java中的BigInteger或Javascript的移植版本)?
  5. 我假设这会自动编译脚本,以便它在显卡中的所有核心上运行,我可以得到确认吗?

如果相关的话,在这个特定的情况下,我正在尝试将相当大的数字作为[非常]扩展的compsci项目的一部分。

编辑:

  1. WebGL着色器是用GLSL编写的。

我在Chrome中使用JavaScript的计算着色器,使用WebGL来解决旅行推销员问题,作为在片段着色器中解决的一组较小的优化问题,以及其他一些遗传优化问题。

问题:

  1. 你可以把浮点数(r: 1.00, g: 234.24234, b: -22.0),但你只能得到整数(r: 255, g: 255, b: 0).这可以通过将单个浮点数编码成4个整数作为每个片段的输出来克服。这实际上是一个非常繁重的操作,它几乎破坏了99%的问题的目的。你最好用简单的整数或布尔子解来解决问题。

  2. 调试是一场史诗般的噩梦,社区正在积极地写这篇文章。

  3. 将数据注入着色器作为像素数据非常慢,读取它甚至更慢。举个例子,读取和写入数据来解决TSP问题分别需要200毫秒和400毫秒,而数据的实际"绘制"或"计算"时间是14毫秒。为了可用,你的数据集必须以正确的方式足够大。

  4. JavaScript是弱类型的(表面上…),而OpenGL ES是强类型的。为了实现互操作,我们必须在JavaScript中使用像Int32Array或Float32Array这样的东西,这在通常标榜其自由的语言中感觉很尴尬和受限。

  5. 大数支持归结为使用5或6个纹理输入数据,将所有像素数据组合成单个数字结构(以某种方式…),然后以有意义的方式操作该大数。非常粗糙,一点也不推荐。

现在有一个项目正在做你正在做的事情——WebCL。不过,我不相信它已经在任何浏览器上运行了。

:

    我猜已经回答了!
  1. 可能不值得在WebGL中做。如果你想玩GPU计算,你现在可能会有更好的运气在浏览器之外做,因为那里的工具链要成熟得多。
  2. 如果你坚持使用WebGL,一种方法可能是把你的结果写进一个纹理中,然后读回来。
  3. 与困难。就像cpu一样,gpu只能在特定的大小值下工作,其他的都必须模拟。
  4. 是的。

我曾经搞过这种东西。在回答你的第三个问题时,我用"制服"来回传递变量

*edit -回头看现在也使用向量'attributes'从外部传递数据。

你需要运行mapp或其他东西来让它在本地工作…https://github.com/byteface/GTP/tree/master/play/simplified

我使用像素来表示字母表中的字母,并使用着色器进行字符串搜索。它的速度快得惊人。比基于CPU的本地搜索程序更快。例如,在GPU上的浏览器中搜索整本书中单个单词的实例比在轻量级程序(如textedit)中更快。我只使用了一个纹理

最新更新