使用HTML5 WebGL着色器进行计算

23

在理论上,似乎可以使用WebGL进行计算--例如计算素数或π之类的内容。但是从我所见过的内容来看,着色器本身并不是用Javascript编写的,因此我有几个问题:

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

如果相关的话,在这种特定情况下,我正在尝试将相当大的数字分解为[非常]扩展的计算机科学项目的一部分。

编辑:

  1. WebGL着色器是用GLSL编写的。
3个回答

27

我已经使用WebGL从JavaScript中的计算着色器来解决旅行商问题,将其作为一系列在片段着色器中解决的较小优化问题的分布式集合,并在其他几个遗传优化问题中使用了该技术。

问题:

  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个输入数据纹理,将所有像素数据组合成单个数字结构(以某种方式...),然后对该大数字进行有意义的操作。非常低效且不推荐使用。


你介意分享一下你的项目吗?我想进行计算,但是不使用GPGPU(例如没有OpenCL、没有CUDA等),只是为了好玩和挑战。每次我搜索时,答案都是“不值得,使用OpenCL”,这让人感到沮丧。如果有一些代码可以帮助入门就太好了。 - NothingsImpossible
5
我的Gist包含许多GPU项目:https://gist.github.com/adrianseeley,可能会有所帮助。这是一个在GPU上实现的前馈神经网络:https://gist.github.com/adrianseeley/08ca986403368018c1c3,这是一个在GPU上实现的量子粒子群算法:https://gist.github.com/adrianseeley/9fd4e0a28e8f559646c4,这是一个GPU计算着色器设置示例:https://gist.github.com/adrianseeley/f768fd7a3aab2370eafc - 有任何问题/咨询请发送电子邮件至consult@osci.international - Adrian Seeley
哇!非常感谢你。 - NothingsImpossible
@AdrianSeeley - 很抱歉打扰这些评论,但是我想知道"VERY"慢相对于数据大小有多慢- 关于TSP花费0.2-0.4秒读取结果的问题... 那里输入/输出的大小是多少? - Kieren Johnstone
这段代码我已经好几个笔记本电脑没运行了,但我还记得获取和输出数据的时间比在GPU上进行计算的时间长10倍以上。这使得当时这个过程更像是一种新奇的东西。 - Adrian Seeley

18

目前有一个项目正在进行,几乎可以做到你正在做的事情 - WebCL。 我不认为它在任何浏览器中都已经上线了。

回答你的问题:

  1. 我猜已经回答了!
  2. 在WebGL中可能不值得做。 如果您想尝试GPU计算,现在最好在浏览器之外进行操作,因为那里的工具链更加成熟。
  3. 如果您被困在WebGL中,一种方法可能是将结果写入纹理并读取该纹理。
  4. 很难。 就像CPU一样,GPU只能本地处理某些大小的值,其他所有内容都必须模拟。
  5. 是的。

确实,你最好坚持使用WebCL,不要碰WebGL。我在某个地方读到过,诺基亚已经开发了一个适用于Firefox的工作插件。只需搜索一下并尝试一下。 - Chiguireitor

6

我曾经涉猎过这种技术。针对你的第三个问题,我使用“uniforms”传递变量。

*编辑-回顾一下,我还使用向量“attributes”从外部传递数据。

要使其在本地工作,您需要运行MAMP或类似软件...... https://github.com/byteface/GTP/tree/master/play/simplified

我使用像素代表字母,并用着色器进行字符串搜索。它非常快速。比基于CPU的原生搜索程序更快。例如,在整本书中搜索一个单词的实例,在浏览器上使用GPU比在像TextEdit这样的轻量级程序中更快。而且我只使用了一个纹理。


uniform变量只限于1024个数组,这使它们在大多数矩阵操作中无法使用。 - Peter Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接