GPU暴力实施

时间:2016-11-07 09:58:12

标签: opencl gpu md5 gpgpu brute-force

我要求就以下问题提出建议:

对于一个研究项目,我正在编写一个基于带有(py)OpenCl的GPU的强力算法。

(我知道JTR在那里)

现在我在Python中有一个Brute-Force-Generator,它填充了每一轮缓冲区的单词(金额= 1024 * 64)。我将缓冲区传递给GPU内核。 GPU正在为缓冲区中的每个值计算MD5哈希值并将其与给定值进行比较。很棒它有效!

BUT:

我不认为这真的是我可以从GPU获得的全部性能 - 或者是它?当我必须通过CPU填充缓冲区并将其传递给GPU时,不存在瓶颈问题。对于哈希计算的比较 - 或者我错了,这已经是我可以得到的紧固或几乎紧固的性能?

在我考虑在这里提出这个问题之前,我做了很多研究。到目前为止,我还无法在GPU内核上找到蛮力实现 - 为什么?

Thx

编辑1:

我尝试以不同的方式解释我想知道的事情。可以说我有一台普通的电脑。在GPU上执行暴力算法比在CPU上执行快(如果你做得对)。我已经查看了一些GPU暴力工具,并且无法在GPU内核上找到一个完整的暴力实现。

现在我正在通过" word packages"到GPU并让他们完成工作(哈希和比较) - 看起来这是常见的方式。分裂'是不是更快。蛮力算法,因此GPU上的每个单元都会生成自己的" word包"通过它自己。

我所要做的就是想知道为什么常见的方法是将值从CPU传递到GPU而不是在GPU上工作CPU工作!是因为不可能在GPU上拆分蛮力算法,还是不值得将其移植到GPU上?

1 个答案:

答案 0 :(得分:1)

关于"蛮力"的表现方法

  

我所想做的就是想知道为什么常见的方法是将带有值的软件包从CPU传递到GPU而不是在GPU上工作CPU工作!是因为不可能在GPU上拆分蛮力算法,还是不值得将其移植到GPU上?

我不知道算法的细节,但是,一般来说,在创建混合CPU-GPU算法之前需要考虑一些要点。仅举几例:

  • 不同的架构(最好的CPU算法可能不是最好的 GPU算法)。
  • 额外同步点。
  • 不同的内存空间(意味着PCIe /网络传输)。
  • 更复杂的算法

  • 更复杂的微调。

  • 供应商政策。

然而,有很多例子同时结合了GPU和CPU的强大功能。通常,算法的顺序或高度发散部分将在CPU上运行,而同类的计算密集部分在GPU上运行。其他应用程序使用CPU将输入数据预处理为更适合GPU处理的格式(例如,更改数据布局)。最后,有一些针对纯粹性能的应用程序确实在CPU上做了大量工作,例如MAGMA项目。

总之,答案是它真的取决于你的算法的细节,如果真的有可能,或者它是否值得设计一个能够充分利用你的CPU-GPU系统的混合算法。

关于当前方法的效果

我认为你应该分两部分来解决你的问题:

  • 这是我的GPU内核有效吗?
  • 我实际上在GPU工作了多长时间?

关于第一个,您没有提供有关GPU内核的任何信息,因此我们无法真正帮助您,但适用一般优化方法:

  1. 是你的计算内存/计算界限吗?
  2. 你的GPU峰值内存带宽有多远?
  3. 您需要从这些问题开始,以了解应该应用哪种优化/算法。看看roofline performance model

    关于第二个问题,即使你没有详细说明,你的应用程序似乎也花了很多时间在小内存传输上(看看这个article如何优化内存传输)。启动PCIe只是为了发送几个字的开销会破坏使用GPU设备带来的任何性能优势。因此,发送一堆小缓冲区而不是包含大量内存的大块内存通常不是最佳选择。

    如果您正在寻找性能,则可能需要重叠计算和内存传输。请阅读this article以获取更多信息。

    作为一般建议,在实施任何优化之前,请花一些时间来分析您的应用程序。这会节省你很多时间。