长话短说,我已经完成了几个交互式软件的原型.我现在使用pygame(python sdl包装器),一切都在CPU上完成.我现在开始将它移植到C,同时寻找现有的可能性来使用一些GPU功能来从冗余操作中吸收CPU.但是,我找不到一个好的"指南",在我的情况下,我应该选择哪些确切的技术/工具.我只是阅读了大量的文档,它很快就耗尽了我的智力.我不确定它是否可能,所以我很困惑.
在这里,我对我开发的典型应用程序框架做了一个非常粗略的草图,但考虑到它现在使用GPU(注意,我几乎没有关于GPU编程的实用知识).仍然重要的是必须精确保留数据类型和功能.这里是:

因此F(A,R,P)是一些自定义函数,例如元素替换,重复等.函数在程序生命周期中可能是恒定的,矩形的形状通常不等于A形状,因此它不是就地计算.所以它们只是根据我的功能生成的.F的例子:A的重复行和列; 用替换表中的值替换值; 将一些瓷砖组成单个阵列; 关于A值等的任何数学函数.如上所述,这一切都可以在CPU上轻松完成,但应用程序必须非常流畅.在纯Python中BTW在添加了几个基于numpy数组的视觉特性后变得无法使用.Cython有助于快速定制功能,但源代码已经是一种沙拉.
题:
这个架构是否反映了一些(标准)技术/ dev.tools?
CUDA是我要找的吗?如果是,那么与我的应用程序结构一致的一些链接/示例将是很好的.
我意识到,这是一个很大的问题,所以如果有帮助,我会提供更多细节.
更新
下面是我的位图编辑器原型的两个典型计算的具体示例.因此编辑器使用索引,数据包括具有相应位掩码的层.我可以确定图层和蒙版的大小与图层大小相同,例如,所有图层的大小相同(1024 ^ 2像素 = 32位值为4 MB).我的调色板就是1024个元素(4个千字节,32 bpp格式).
考虑我现在要做两件事:  
第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步.现在我有一个数组,并希望用一些调色板"着色"它,所以它将是我的查找表.正如我现在看到的,查找表元素的同时读取存在问题.
 
但我的想法是,可能只需复制所有块的调色板,因此每个块都可以读取自己的调色板?像这样: 

您想要做的是使用高频调度将值非常快速地发送到 GPU,然后显示函数的结果,该函数基本上是纹理查找和一些参数。
我想说,只有满足两个条件,这个问题才值得在 GPU 上解决:
的大小A[]经过优化,使传输时间变得无关紧要(请参见http://blog.theincredibleholk.org/blog/2012/11/29/a-look-at-gpu-memory-transfer/)。
查找表不太大和/或查找值的组织方式可以最大限度地利用缓存,一般来说,GPU 上的随机查找可能很慢,理想情况下您可以将值预加载到R[]共享内存缓冲区中对于A[]缓冲区的每个元素。
如果您能够积极回答这两个问题,然后才考虑尝试使用 GPU 来解决您的问题,否则这两个因素将压倒 GPU 为您提供的计算加速。
您可以查看的另一件事是尽可能重叠传输和计算时间,以尽可能隐藏 CPU->GPU 数据的缓慢传输速率。
关于您的F(A, R, P)函数,您需要确保您不需要知道 的值F(A, R, P)[0]才能知道 的值是什么F(A, R, P)[1],因为如果您这样做,那么您需要F(A, R, P)使用一些并行化技术重写来解决这个问题。如果您的函数数量有限F(),那么可以通过编写每个F()函数的并行版本供 GPU 使用来解决这个问题,但如果F()是用户定义的,那么您的问题会变得有点棘手。
我希望这些信息足以让您对是否应该使用 GPU 来解决问题有一个明智的猜测。
编辑
读完你的编辑后,我会说是的。调色板可以容纳在共享内存中(参见GPU 共享内存大小非常小 - 我该怎么办?),速度非常快,如果您有多个调色板,您可以容纳 16KB(大多数卡上共享内存的大小) ) / 每个调色板 4KB = 每个线程块 4 个调色板。
最后一个警告,整数运算在 GPU 上并不是最快的,在实现算法后如有必要请考虑使用浮点,并且它是一种廉价的优化。
| 归档时间: | 
 | 
| 查看次数: | 715 次 | 
| 最近记录: |