【发布时间】:2015-05-20 23:32:10
【问题描述】:
长话短说,我已经做了几个交互软件的原型。我现在使用 pygame(python sdl 包装器),一切都在 CPU 上完成。我现在开始将它移植到 C 中,同时寻找现有的可能性来使用一些 GPU 功能来使 CPU 摆脱冗余操作。但是,我找不到一个好的“指南”,我应该在我的情况下选择哪些确切的技术/工具。我刚刚阅读了大量的文档,它很快耗尽了我的精神力量。我不确定这是否可能,所以我很困惑。
在这里,我对我开发的典型应用程序骨架做了一个非常粗略的草图,但考虑到它现在使用 GPU(注意,我对 GPU 编程的实践知识几乎为零)。仍然重要的是必须准确保留数据类型和功能。这里是:
所以 F(A,R,P) 是一些自定义函数,例如元素替换、重复等。函数在程序生命周期中可能是恒定的,矩形的形状一般不等于 A 形状,所以它不在-地方计算。所以它们只是用我的函数生成的。 F的例子:重复A的行和列;用替换表中的值替换值;将一些图块组合成单个数组; A 值上的任何数学函数等。如上所述,所有这些都可以在 CPU 上轻松完成,但应用程序必须非常流畅。顺便说一句,在纯 Python 中,在添加了几个基于 numpy 数组的视觉功能后,它变得无法使用。 Cython 有助于制作快速的自定义函数,但源代码已经有点像沙拉了。
问题:
此架构是否反映了某些(标准)技术/dev.tools?
CUDA 是我想要的吗?如果是,一些与我的应用程序结构一致的链接/示例会很棒。
我知道,这是个大问题,所以如果有帮助,我会提供更多细节。
更新
这是我的位图编辑器原型的两个典型计算的具体示例。因此编辑器使用索引,并且数据包括具有相应位掩码的图层。我可以确定图层的大小和蒙版的大小与图层的大小相同,例如,所有图层的大小都相同(1024^2 像素 = 4 MB,对于 32 位值)。我的调色板是 1024 个元素(32 bpp 格式为 4 KB)。
考虑一下我现在想做两件事:
第 1 步。我想将所有图层合二为一。假设 A1 是默认图层(背景),图层“A2”和“A3”具有蒙版“m2”和“m3”。在python中我会写:
from numpy import logical_not
...
Result = (A1 * logical_not(m2) + A2 * m2) * logical_not(m3) + A3 * m3
由于数据是独立的,我相信它必须与并行块的数量成正比。
第 2 步。现在我有一个数组,想用一些调色板“着色”它,所以它将是我的查找表。正如我现在所看到的,同时读取查找表元素存在问题。
但我的想法是,也许可以为所有块复制调色板,这样每个块都可以读取自己的调色板?像这样:
【问题讨论】:
-
仅供参考:有 Theano (Python) 可以使用 GPU。它将符号表达式编译为在 GPU 上运行的 CUDA 代码。
-
如果有很多独立的数据通过它(数百 MB/s),那么它真的可以加快速度。我看到的唯一问题是“生成的矩形可以是任意大小”。我从来没有听说过/读过关于通过内核分配的内容。如果在启动之前知道它的大小,那没关系,但是必须在 GPU 内核启动之前定义数组。所以它基本上取决于F(输入和输出)和A的大小
-
@blind.wolf 是的,大小是已知的,只是不能与 A 的形状相同,例如在整数数组放大的情况下。
-
为什么会有人投票结束这个问题?????
-
@buttifulbuttefly 好吧,我想是的。例如,假设您有几个数组,并且您想获得一个平均值。类似于 Photoshop 中的图层,但只有索引值。现在移动一层并实时查看变化的结果。但首先,我想要smth。非常非常简单,就像在提到的带有替换或行/列重复的示例中一样。如果我可以让我的数组充满调色板值,那将是一个很好的改进。替换可以完美并行,对吗?