【问题标题】:Is there a simple way to run a C/C++ program parallelly without recoding?有没有一种简单的方法可以在不重新编码的情况下并行运行 C/C++ 程序?
【发布时间】:2013-02-08 23:59:04
【问题描述】:
【问题讨论】:
标签:
c
multithreading
parallel-processing
multicore
【解决方案2】:
我有一台多核机器,但是当我尝试运行这个旧 C
程序 (http://www.statmt.org/moses/giza/mkcls.html) 它只使用
一个核心。有没有办法运行 C 代码并发送周期/线程
到其他核心?
不重新编译,绝对不行。
您也许可以进行一些小的调整并使用一个工具来获取您的源代码并自动将其并行化,但是由于每个内核都是完全独立的——它们“相距甚远”——你不能只在它们之间传播指令两个核心。代码必须以有两个“指令流”的方式编译 - 如果您只是将所有其他指令发送到双核系统中的每个其他核心,它的运行速度可能会比 if 慢 10-100 倍您在一个内核上运行所有代码,因为内核之间需要额外的通信开销[每个内核已经能够并行运行多条指令,这首先是多核处理器的主要原因是这种并行运行事物的能力只能使事情变得更快——在你需要前一条指令的结果之前,只有这么多指令可以运行,等等]。
将代码重新编码为 CUDA 是唯一的方法吗?
不,还有很多其他选择。 OpenMP,使用多线程的手动编码。或者,最简单的方法是用不同的输入数据启动程序两到四次,然后让它们完全分开运行。这显然只有在您可以同时运行多个变体的情况下才有效......
关于“使事物并行化”的一句话。这不是一件神奇的事情,可以让所有代码更快。在你需要前一个计算结果的地方计算一些东西是非常无望的——比如你想计算斐波那契数列——f(n) = f(n-1) + f(n-2)——你不能用并行计算来做到这一点,因为你需要另一个计算的结果( s) 进行此操作。另一方面,如果您有十几个非常大的数字要检查它们是否是质数,那么使用 4 核处理器和 4 个线程,您将能够以大约四倍的速度执行此操作。
如果您有一个大矩阵需要乘以另一个大矩阵或向量,那么最好将其拆分,这样您就可以在每个核心上进行部分计算。
我没有查看您特定项目的代码,但仅查看描述,我认为它可能会很好地并行化。
【解决方案3】:
您可以在多个进程中运行它并编写另一个程序将任务转发到其中一个进程。
CUDA?如果你想让它在你的显卡上运行,你只需要它,所以在这种情况下这是没有意义的。