在我看来,理论上可以使用WebGL进行计算-例如计算素数或π或类似的东西。然而,从我所看到的一点点,着色器本身不是用Javascript编写的,所以我有几个问题:
-
着色器是用什么语言写的? - 考虑到着色器的工作方式,尝试做这样的事情是否值得?
- 在运行时如何来回传递变量?或者如果不可能的话,如何在着色器完成执行后传递信息?
- 既然它不是Javascript,如何处理非常大的整数(Java中的BigInteger或Javascript的移植版本)?
- 我假设这会自动编译脚本,以便它在显卡中的所有核心上运行,我可以得到确认吗?
如果相关的话,在这个特定的情况下,我正在尝试将相当大的数字作为[非常]扩展的compsci项目的一部分。
编辑:- WebGL着色器是用GLSL编写的。
我在Chrome中使用JavaScript的计算着色器,使用WebGL来解决旅行推销员问题,作为在片段着色器中解决的一组较小的优化问题,以及其他一些遗传优化问题。
问题:
-
你可以把浮点数(r: 1.00, g: 234.24234, b: -22.0),但你只能得到整数(r: 255, g: 255, b: 0).这可以通过将单个浮点数编码成4个整数作为每个片段的输出来克服。这实际上是一个非常繁重的操作,它几乎破坏了99%的问题的目的。你最好用简单的整数或布尔子解来解决问题。
-
调试是一场史诗般的噩梦,社区正在积极地写这篇文章。
-
将数据注入着色器作为像素数据非常慢,读取它甚至更慢。举个例子,读取和写入数据来解决TSP问题分别需要200毫秒和400毫秒,而数据的实际"绘制"或"计算"时间是14毫秒。为了可用,你的数据集必须以正确的方式足够大。
-
JavaScript是弱类型的(表面上…),而OpenGL ES是强类型的。为了实现互操作,我们必须在JavaScript中使用像Int32Array或Float32Array这样的东西,这在通常标榜其自由的语言中感觉很尴尬和受限。
-
大数支持归结为使用5或6个纹理输入数据,将所有像素数据组合成单个数字结构(以某种方式…),然后以有意义的方式操作该大数。非常粗糙,一点也不推荐。
现在有一个项目正在做你正在做的事情——WebCL。不过,我不相信它已经在任何浏览器上运行了。
:
- 我猜已经回答了!
- 可能不值得在WebGL中做。如果你想玩GPU计算,你现在可能会有更好的运气在浏览器之外做,因为那里的工具链要成熟得多。
- 如果你坚持使用WebGL,一种方法可能是把你的结果写进一个纹理中,然后读回来。
- 与困难。就像cpu一样,gpu只能在特定的大小值下工作,其他的都必须模拟。
- 是的。
我曾经搞过这种东西。在回答你的第三个问题时,我用"制服"来回传递变量
*edit -回头看现在也使用向量'attributes'从外部传递数据。
你需要运行mapp或其他东西来让它在本地工作…https://github.com/byteface/GTP/tree/master/play/simplified
我使用像素来表示字母表中的字母,并使用着色器进行字符串搜索。它的速度快得惊人。比基于CPU的本地搜索程序更快。例如,在GPU上的浏览器中搜索整本书中单个单词的实例比在轻量级程序(如textedit)中更快。我只使用了一个纹理