Javascript 是否可以使用WebGL在浏览器中的GPU上运行折叠操作?

Javascript 是否可以使用WebGL在浏览器中的GPU上运行折叠操作?,javascript,browser,webgl,gpu,Javascript,Browser,Webgl,Gpu,我正在运行一个数据处理应用程序,它几乎是: var f = function(a,b){ /* any function of type int -> int -> int */ }; var g = function(a){ /* any function of type int -> int */ }; function my_computation(state){ var data = state[2]; for (var i=0,l=data.lengt

我正在运行一个数据处理应用程序,它几乎是:

var f = function(a,b){ /* any function of type int -> int -> int */ };
var g = function(a){ /* any function of type int -> int */ };
function my_computation(state){
    var data = state[2];
    for (var i=0,l=data.length,res=0; i<l; ++i)
        res = f(res,g(data[i]));
    state[3] = res;
    return res;
}
var f=函数(a,b){/*int->int->int*/}类型的任何函数;
var g=函数(a){/*int->int*/}类型的任何函数;
函数my_计算(状态){
var数据=状态[2];

对于(var i=0,l=data.length,res=0;i我会说是的。我自己也经常想到这一点。数据将作为顶点属性缓冲区附加,自定义着色器将执行折叠代码,将结果“渲染”到屏幕外缓冲区。然后将结果缓冲区读回CPU内存。

从您的注释:

我对顶点着色器了解不多,但据我所知,它在孤立像素中工作,对于折叠,你需要一种累积模式。不是吗

如果要使用WebGL在阵列上进行计算,最有可能的方法是使用片段着色器,而不是顶点着色器。如果使用覆盖整个视口的输入几何体,则片段着色器只是一个逐像素计算图像的程序。它可以用作数字参数和任意纹理的输入。进一步此外,还可以将输出渲染到纹理

这就是输入的方式:将输入数据隐藏在纹理中,并让片段着色器在纹理中进行查找。在纹理中进行多个偏移查找是完全正常的;例如,模糊效果就是这样工作的

您关注累加是对的。没有对所有像素进行折叠的本机方法。但是,如果您可以以“map reduce”的方式表达您的算法,其中reduce操作组合了两个输出,并且不关心它们是否是前一个reduce步骤的输入,那么您可以这样做:

  • 将输入数据加载到1像素高、N像素宽的纹理中。(不确定使用方形纹理是否会给出更好的上限,但这更易于描述。)
  • 运行“贴图”(
    g
    ,非累积计算)着色器程序,生成中间输出纹理
  • 运行着色器,对中间纹理的每对相邻像素(或类似像素)执行“减少”操作(
    f
    ),生成另一个宽度为一半的纹理
  • 对该输出再次执行相同的操作

  • 这将仅在O(log n)JavaScript操作中获得您的单一答案。

    如果您希望在浏览器上运行它,您将受到WebGL/extensions支持的限制,特别是在CPU访问GPU数据方面

    您可以在下面的代码库中查看过滤器/边缘检测的着色器代码,该代码展示了如何在
    片段着色器中执行此操作


    在此之后,您可以使用
    readPixels
    访问数据。注意-片段着色器只能输出定点数据。

    激励性的,但如果我不要求太多,您能详细说明一下吗?我不知道着色器如何执行这种折叠代码。我不太了解顶点着色器,但据我所知,它确实有效n个孤立的像素,对于折叠,你需要一个累加模式。不?(如果你选择“Google的Mapreduce”样式,可能不会,但是你仍然需要一种同时处理两个不同像素的方法,例如,求和…)这正是我想要的。我很高兴知道这是可能的。不过,我希望我能有一个例子。WebGL的教程很少,而且我想要的东西根本不存在。简单的事情包括“如何创建纹理”、“如何在其上运行着色器”、“如何在GPU上存储结果并在其上运行另一个着色器”,“如何最终在主机上获得结果"等。但我要说的是…@Viclib你知道如何继续吗?我在寻找完全相同的东西。@erb我已经设法通过使用webgl从1024x1024纹理渲染到512x512纹理,再到256x256纹理等来减少。每个渲染步骤一起计算了4个数字。我无法获得任何数字加快速度,但是它足够快,足以让人怀疑一个更熟练的glsl程序员可以做到这一点。我找到了一个JS库,可以为您做到这一点,但我对这个问题不再感兴趣了。它很好,我认为您应该找到它,但我不记得任何关键字,所以您必须四处询问是否有人知道一个可以做什么的库webcl也可以,除了webgl。