python如何使用gpu加速_在Python中可以使用GPU加速散列吗?

有两个障碍:编写在GPU上执行的程序。AFAIK,目前没有任何机制可以将Python程序转换为GPU执行的代码。所以除非你能找到你需要的东西(这可能是有可能的,因为它看起来是一个相当常见的用例),否则你必须使用一种GPU编程语言(CUDA,OpenCL,Haskell,…)

从Python调用GPU上运行的程序,并交换数据。有几个Python+CUDA项目可以做到这一点:

通过适当的搜索,你可能会发现更多。

然后,Python程序将使用第2部分中的技术之一或等效技术加载并调用GPU“内核”(使用本答案第1部分中的技术创建的程序)。

编辑

您可以生成整个“暴力”值集,以及GPU上的md5散列。然后使用Python检索结果。这可能比用Python生成值、将它们传递给GPU,然后取回md5更容易

如果我理解了,程序将生成所有1个字符、2、3、4、5和6个小写字母字符串,并生成一个md5散列,是吗?

Edit2-我之前的分析完全错误-我道歉

Edit3:SkimmingWikipedia MD5看起来可以优化计算定长字符串(例如6个ASCII字符)的MD5。

根据维基百科的伪代码,它只有64个循环,16个循环的迭代组使用相同的算法。因此,如果密钥小于55字节,计算的核心可以从以下位置“展开”:for i from 0 to 63

if 0 ≤ i ≤ 15 then

f := (b and c) or ((not b) and d)

g := i

else if 16 ≤ i ≤ 31

f := (d and b) or ((not d) and c)

g := (5×i + 1) mod 16

else if 32 ≤ i ≤ 47

f := b xor c xor d

g := (3×i + 5) mod 16

else if 48 ≤ i ≤ 63

f := c xor (b or (not d))

g := (7×i) mod 16

temp := d

d := c

c := b

b := b + leftrotate((a + f + k[i] + w[g]) , r[i])

a := temp

end for

致:// i == 0

f := (b and c) or ((not b) and d) // +4 ops

// g := i

temp := d

d := c

c := b

b := b + leftrotate((a + f + k[0] + w[0]) , r[0]) // 9 ops

a := temp

// i == 1

f := (b and c) or ((not b) and d)

// g := i

temp := d

d := c

c := b

b := b + leftrotate((a + f + k[1] + w[1]) , r[1])

a := temp

这种展开会导致一些数组索引为常量,这将允许一个好的GPU编译器执行更多的常量传播。这可能会带来显著的改善。每个步骤大约有9个操作,编译器将需要洗牌5个数据片段,因此大约14个操作/步骤*64个步骤,大约1000个操作。

编辑4:

快活!我读过更多的维基百科MD5算法-MD5比我想象的更容易攻击。每组16个中只有前两个循环直接使用6字节的变量键字符串,其余的字符串是常量。算法的其余部分是洗牌和按位操作,这些操作可能需要进行非常重要的进一步优化。每16个循环中只有2个涉及到密钥,那么可能会快8倍,甚至超过4倍

所以不是1024核的GPU,以1GHz的频率运行,给出1024个哈希/微秒,而是4096/微秒或8096/us=4-8个哈希/纳秒

大约有27^6个键=387420489个键,因此有md5散列。

387420489键/4-8/纳秒大约=0.05-0.1秒

主机和GPU之间的通信将相当缓慢,但不太可能超过100%。

大约在0.1秒到0.2秒之间。

md5哈希是16字节,因此如果要存储它,则将消耗6.2 GB。在两个现代gpu上,每个gpu只需要两次传输,但开销非常大。如果哈希值保存到磁盘(甚至使用SSD),或通过10Gbit以太网移动,则哈希生成将被I/O时间淹没。

只有94个可打印的ASCII字符,因此对于每个ASCII 6字符的密钥:

94^6=689869781056键/4-8/纳秒=86-172秒

哦天哪!-(一)

长钥匙,还有比MD5更好的东西!

也许试着编写一个Python程序来生成最佳的GPU算法?

通过在Python程序中“展开”循环来生成GPU“内核”的文本,并打印直线计算的文本,所有常量都被填充在。

然后尝试找出计算每个密钥长度的MD5的最佳指令序列。使用展开程序,尝试跟踪每个位上的操作和依赖项,然后尝试将这些位及其操作重新组合为连续的32位字和新的直线计算。(公平地说,也许GPU编译器可以做到这一点?可能很有意思)

你可能感兴趣的:(python如何使用gpu加速)