3

我有一台多核机器,但是当我尝试运行这个旧的 C 程序(http://www.statmt.org/moses/giza/mkcls.html)时,它只使用一个核心。有没有办法运行 C 代码并将周期/线程发送到其他内核?

将代码重新编码为 CUDA 是唯一的方法吗?

4

3 回答 3

5

是的,这称为自动并行化,它是一个活跃的研究领域。

但是,我知道没有免费的工具可以做到这一点。维基百科文章“自动并行化”有一个工具列表。您将需要访问原始源代码,并且您可能必须向代码添加并行化指令。

于 2013-02-23T11:23:42.790 回答
5

我有一台多核机器,但是当我尝试运行这个旧的 C 程序(http://www.statmt.org/moses/giza/mkcls.html)时,它只使用一个核心。有没有办法运行 C 代码并将周期/线程发送到其他内核?

不重新编译,肯定不行。

您也许可以进行一些细微的调整并使用一个工具来获取您的源代码并自动将其并行化,但是由于每个内核都是非常独立的——它们“相距甚远”——你不能只在两个内核之间传播指令. 代码必须以有两个“指令流”的方式编译 - 如果您只是将所有其他指令发送到双核系统中的每个其他核心,它的运行速度可能会比如果你在一个内核上运行所有代码,因为内核之间需要额外的通信开销[每个内核已经有能力并行运行多条指令,

将代码重新编码为 CUDA 是唯一的方法吗?

不,还有很多其他选择。OpenMP,使用多线程的手动编码。或者,最简单的方法是用不同的输入数据启动程序两到四次,然后让它们完全分开运行。这显然只有在您可以同时运行多个变体的情况下才有效......

关于“使事情平行”的一句话。这不是一件神奇的事情,可以让所有代码更快。在需要上一次计算结果的地方计算一些东西是非常无望的——比如说你想计算斐波那契数列f(n) = f(n-1) + f(n-2)——你不能用并行计算来做到这一点,因为你需要其他计算的结果来继续这个。另一方面,如果您有十几个非常大的数字要检查它们是否是质数,那么使用 4 核处理器和 4 个线程,您将能够以大约四倍的速度执行此操作。

如果您有一个大矩阵需要乘以另一个大矩阵或向量,那么拆分是理想的,因此您可以在每个核心上进行部分计算。

我没有查看您特定项目的代码,但仅查看描述,我认为它可能会很好地并行化。

于 2013-02-23T12:17:08.883 回答
0

您可以在多个进程中运行它,并编写另一个程序将任务转发到这些进程中的任何一个。

库达?如果你想让它在你的显卡上运行,你只需要它,所以在这种情况下这是没有意义的。

于 2013-02-23T12:30:24.913 回答