我需要编写一个应用程序,它从字典中散列单词以生成WPA预共享密钥。这是我的“网络安全”课程的论文。应用程序需要并行才能提高性能。我在IT研究方面有一些MPI的经验,但我想把它与CUDA联系起来。我们的想法是使用MPI将负载均匀地分配到集群的节点,然后利用CUDA在节点的GPU内并行运行各个块。
使用MPI分配负载是我过去可以轻松完成的工作。使用CUDA进行计算也是我可以学习的。还有一个项目(pyrit)或多或少地做了我需要做的事情(实际上还有很多),我可以从那里得到想法。
我想就如何在MPI和CUDA之间建立连接提出一些建议。如果有人建造了这样的东西,我将非常感谢他的建议和建议。此外,如果您碰巧知道有关该主题的任何资源,请将它们指向我。
对于冗长的介绍感到抱歉,但我认为有必要提供一些背景知识。
答案 0 :(得分:3)
这个问题比较开放,所以很难给出明确的答案。这只是对高性能马克,我和Jonathan Dursi的评论的总结。我不主张作者身份,因此将此答案作为社区维基。
MPI和CUDA是正交的。前者是IPC中间件,用于在进程之间进行通信(可能驻留在不同的节点上),而后者为使用它的每个进程提供高度数据并行的共享内存计算。您可以将任务分解为许多小子任务,并使用MPI将它们分发到网络上运行的工作进程。 master / worker 方法适用于这种应用,特别是如果字典中的单词长度变化很大,并且预期处理时间的变化。提供所有必需的输入值后,工作进程可以使用CUDA并行执行必要的计算,然后使用MPI返回结果。 MPI还提供启动和控制多节点作业所需的机制。
虽然MPI和CUDA可以单独使用,但现代MPI实现提供了一些模糊这两者之间界限的机制。它既可以直接支持MPI通信操作中的设备指针,也可以在必要时透明地调用CUDA函数来复制内存,甚至可以支持RDMA进出设备内存而无需中间复制到主内存。前者简化了代码,而后者可以节省不同的时间,具体取决于算法的结构。后者还需要失败的新CUDA硬件和驱动程序以及更新的网络设备(例如更新的InfiniBand HCA)。