我有一台多核机器但是当我尝试运行这个旧的C程序(http://www.statmt.org/moses/giza/mkcls.html)时,它只使用一个核心。有没有办法运行C代码并将周期/线程发送到其他内核?
将代码重新编码到CUDA中是唯一的方法吗?
答案 0 :(得分:5)
是的,这称为自动并行化,它是一个活跃的研究领域。
但是,我知道没有免费的工具。维基百科文章"automatic parallelization"有一个工具列表。您将需要访问原始源代码,并且可能必须向代码添加并行化指令。
答案 1 :(得分:5)
我有一台多核机器但是当我试图运行这个旧的C时 程序(http://www.statmt.org/moses/giza/mkcls.html)它只使用 一个核心。有没有办法运行C代码并发送循环/线程 到其他核心?
没有重新编译,绝对不是。
您可以进行一些小的调整并使用一个工具来获取源并自动并行化它,但由于每个核心是完全独立的 - 它们“相隔很远” - 您不能只是在两者之间传播指令两个核心。代码必须以这样的方式编译,即有两个“指令流” - 如果你只是将每个其他指令发送到双核系统中的每个其他核心,它可能会比运行速度慢10-100倍。你在一个核心上运行所有代码,因为核心之间的通信需要额外的额外开销[每个核心已经能够并行运行多个指令,并且首先是多核处理器的主要原因这种并行运行的能力只能使事情变得更快 - 在你需要先前指令的结果等之前,只有很多指令可以运行。
将代码重新编码到CUDA中是唯一的方法吗?
不,还有很多其他选择。 OpenMP,使用多个线程进行手动编码。或者,最简单的方法,使用不同的输入数据启动程序两到四次,并让它们完全分开运行。这显然只有在你可以同时运行多个变种的情况下才有效...
关于“使事物平行”的一句话。让所有代码更快的并不是一件神奇的事情。计算你需要先前计算结果的东西是非常没有希望的 - 比如想要计算斐波那契数列 - f(n) = f(n-1) + f(n-2)
- 你不能用并行计算来做到这一点,因为你需要来自另一个的结果计算以进行此操作。另一方面,如果你有十几个非常大的数字要检查它们是否是素数,那么使用4核处理器和4个线程,你可以做到大约快4倍。
如果你有一个需要乘以另一个大矩阵或向量的大矩阵,那么拆分是理想的,这样你就可以对每个核心进行部分计算。
我没有看过你的特定项目的代码,但只是看一下描述,我认为它可以很好地并行化。
答案 2 :(得分:0)
您可以在多个进程中运行它并编写另一个程序,将任务转发到这些进程中的任何一个。
CUDA?如果你想让它在你的显卡上运行,你只需要它,所以在这种情况下没有意义。