【问题标题】:Can I use AS3 Stage3D AGAL to achieve CUDA like processing?我可以使用 AS3 Stage3D AGAL 来实现类似 CUDA 的处理吗?
【发布时间】:2012-12-31 16:32:10
【问题描述】:

我有一个程序可以在 320x240 流运行时检测球,但如果我流更大的分辨率,它会变得太慢。我假设如果我可以使用 GPU 来计算每个像素(以及它们的相邻帧和相邻像素),它会更快。有人知道我是否可以使用 AGAL 从 GPU 取回数据?

在排序中,我有下面的循环,通过帧的每个像素,我想在 GPU 上计算最多,以获得更好的性能。

for(var i:int=cv.length-1; i>1;i--){
                if( (110*255) < (cv[i] & 0x0000FF00) && (cv[i] & 0x0000FF00) < (150*255)){ //i zöld
                    if(  (cv[i+2] & 0x0000FF00) > (150*255) ) { //i+2 világos
                        if(floodhere(cv, i+2)){ //méret nagy
                            prevDiff[i]=0xffffffff; //fehér
                            close.push(i);
                        }
                        else prevDiff[i]=0xffff0000 //méret kicsi -> piros
                    } else {
                        prevDiff[i]=0xff000055 //kék
                    }
                } else {
                    prevDiff[i]=0xff000000 //fekete
                }
            }

【问题讨论】:

  • 不确定您的问题的答案是什么,但如果渲染速度很慢,您可以考虑使用 Actionscript Workers 在另一个线程中进行计算(不过需要最新的 Flash Player 版本)。
  • 不,我不需要渲染,而是计算。
  • 我应该更清楚。您可以使用 Workers 在单独的线程中进行计算。否则,您的计算将与其他所有内容(渲染)在同一个线程中进行。如果您没有其他选择,可能值得一试……虽然您不会获得类似 CUDA 的性能,但它可能会比您现在拥有的更快。

标签: actionscript-3 flash apache-flex stage3d agal


【解决方案1】:

您可以使用 AGAL 在 GPU 上进行快速计算,但请注意限制。 大致是这样的:
您需要将数据作为纹理(n*m 矩阵)上传,一个数据点是 3x8 位值。将任何类型的大数据上传到 GPU 都很慢,因此您不应该在每一帧都这样做。将纹理恢复到 Actionscript 也很慢。
您可以将数据上传到 GPU 到其全局变量内存中(但数量有限)

GPU 将在该矩阵的每个元素上并行运行您的 AGAL 程序,并且输出也将是一个 n*m 矩阵。
每个程序实例都可以访问 3 个东西:它的坐标、全局变量和上传的矩阵。您的程序的输出将被写入到相同位置的输出矩阵。如果您编写多个程序,可以快速访问此输出矩阵,但将其恢复到正常内存(用于操作脚本操作)很慢。

与 Actionscript 相比,AGAL 程序非常有限:
- 最大限度。 256条指令。
- 没有循环、函数、类。您只有数学运算符和条件(“if-else”)。
- 无法写入全局内存

【讨论】:

    【解决方案2】:

    您也许可以使用 PixelBender。它还可以在单​​独的线程中工作,并利用多核 CPU,因此比 actionscript 快得多。

    请参阅http://www.flashmagazine.com/tutorials/detail/using_pixel_bender_to_calculate_information/ 了解示例

    【讨论】:

    • 我应该指出 PixelBender 的功能有限——该语言比 ActionScript 简单得多——因此它可能并不完全适合。我在这里写了关于基本用法(设置、语言语法等)的博客:blog.leeburrows.com/2011/01/pixelbender-filters-1)。
    • 不可能了。 PixelBender 已在 Flash Player 11 及更高版本中被销毁,因为 Adob​​e 关闭了 JIT 编译。他们的错误跟踪器中的问题已被标记为“无法修复” - bugbase.adobe.com/index.cfm?event=bug&id=3591185
    【解决方案3】:

    无法取回数据。你只能恢复颜色。此外,要在动作脚本中获取像素颜色,您应该将数据从纹理复制到位图数据,这非常慢。

    【讨论】:

    • 颜色就是数据——每个像素都是一个无符号的 32 位整数。 PB 不在乎你用它的输出做什么;它不一定是图像
    • 有人谈到 stage3D。
    • 不正确。 sydd 的回答适用。 AGAL 使 GPGPU 处理成为可能。
    • 它很慢,但可能。是的,我同意读回数据很慢。但这并非不可能。
    • 您所能做的就是获取 BitmapData。但是你不能在随机位置写入这个 BitmapData - 片段着色器将根据 uvs 写入它。您可以将浮点数编码为 in,但只能在 0.0 - 1.0 范围内。所以,它是没用的,与 GPGPU 没有任何关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2017-10-16
    • 2011-01-12
    • 2015-08-27
    • 2018-12-16
    相关资源
    最近更新 更多