我有一个问题,它基本上是探索一些利用机器上所有核心的偷懒方法。
假设我有一个程序“./theprogram”,它对数据集 D 起作用,是“高度并行的”,并且接受一个命令行参数 j,该参数在由 j 确定的数据集子集上执行该程序。
然后假设我在终端中运行命令
./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &
现在我已经为 j1、j2、...jfinal 生成了子进程
我的问题是:假设我有现代的 unix 系统(比如说在多核芯片上运行的最新 Mac Os X)
那么进程是否会分别分布在所有核心上?也就是说,我会利用所有核心吗?
答案1
理论上是的。
操作系统将任务调度到未使用的 CPU 核心上。它知道什么时候核心未使用,因为它刚刚取消了该核心上的任务调度。
您的进程将在其结构中有一个标志,表示它是否正在等待输入(磁盘,键盘,鼠标等),如果它没有等待任何这些东西,那么它是可调度的。
对于每个核心,操作系统基本上都会运行其可调度任务列表并进行调度。这些任务将在核心上分配一段时间,然后再次暂停,以便操作系统能够查看其他进程需要运行。
如果不需要运行其他进程,那么您的进程仍将位于列表顶部并可再次运行。
自然的效果是,只需很少的管理开销,您的 CPU 将得到充分利用,假设您的所有进程都不会相互阻塞或花费大量时间等待磁盘访问。
您可以使用任何具有可并行数据的多线程应用程序对此进行测试。视频编码和数据压缩是这种并行性发挥作用的两种情况。
Handbrake 是一款基于 CPU 的视频编码器(最近还支持 GPU),可以使用任意数量的 CPU 内核,从而大幅提高速度。许多视频编码器可以充分利用多个内核。x.264 和其他编码器也支持多线程。
7-Zip 是一款压缩程序,它还可以利用 LZMA2 算法中的多个线程来加速压缩。压缩字典的构建是一个合理的共享过程,一旦您拥有了字典,实际的压缩就“很容易”并行化。
答案2
为了实现多进程,你必须选择遵循以下规则的代码部分:
- 不能依赖以前的结果
- 不需要按特定顺序执行
- 不会返回任何需要在代码中稍后访问的内容
所以从我听到的来看,您应该能够使用多个核心。