使用HTML5 WebGL着色器进行计算

ske*_*gse 21 javascript html5 shader webgl

在我看来,理论上可以使用WebGL进行计算 - 例如计算素数或π或沿着这些线的某些东西.但是,从我看到的很少,着色器本身不是用Javascript编写的,所以我有几个问题:

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

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

编辑:

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

Adr*_*ley 19

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

  • 我的要点包含很多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进行问题/咨询. (3认同)

dus*_*uff 15

目前正在开展一个项目来完成您正在做的事情 - WebCL.不过,我不相信它现在已经存在于任何浏览器中.

回答你的问题:

  1. 我猜已经回答了!
  2. 可能不值得在WebGL中做.如果你想玩GPU计算,你现在可能有更好的运气在浏览器之外,因为工具链在那里更成熟.
  3. 如果您坚持使用WebGL,一种方法可能是将结果写入纹理并将其读回.
  4. 有困难.与CPU类似,GPU本身只能使用特定大小的值,其他所有内容都必须进行仿真.
  5. 是的.


byt*_*ace 6

我曾经用这种东西搞砸了.在回答你的第三个问题时,我通过'制服'传递了vars

*编辑 - 回顾现在也使用矢量'属性'从外部传递数据.

你需要运行mamp或其他东西才能在本地工作... https://github.com/byteface/GTP/tree/master/play/simplified

我使用像素来表示字母表的字母,并使用着色器进行字符串搜索.它的速度非常快.比基于CPU的本机搜索程序更快.即在整个书中搜索单个单词的实例在GPU上的浏览器中比在像textedit这样的轻量级程序中更快.我只使用一个纹理.