我有一系列脚本可以在具有1个物理和1的物理计算机上运行。逻辑核心。
我已经尝试按顺序运行它们,并且还使用类似下面的bash脚本来分配它们。并行运行的后台进程实际上比按顺序运行时间要长。
我的问题是:在什么情况下这样的工作量应该并行运行?也就是说,我必须拥有特定的硬件,还是可以使用我所拥有的单处理器计算机更有效地执行此操作?
#!/bin/bash
# Run them in sequence...
T1=$(date +%s)
python proc_test1.py
python proc_test2.py
python proc_test3.py
T2=$(date +%s)
T=$((T2-T1))
echo "Scripts took ${T} seconds."
# Now fork them...
T1=$(date +%s)
python proc_test1.py &
python proc_test2.py &
python proc_test3.py &
wait
T2=$(date +%s)
T=$((T2-T1))
echo "Scripts took ${T} seconds."
exit 0
答案 0 :(得分:1)
当硬件可用时,并行处理通常会变得有益。例如,如果您有三个逻辑CPU,则可以同时进行三次计算。因此,理想情况下,如果您使用具有三个可用处理器的分支运行proc_test1.py三次,则所有三个将在运行proc_test1.py的一个实例的同一时间内完成。
换句话说,如果有足够的硬件,连续运行三个proc_test1.py将花费三倍于使用forks运行它们。
现在,鉴于您只有一个硬件CPU,因此并行作业的运行速度比串行作业慢得多,因为每个python程序将相互竞争cpu时间。 cpu停止一个作业并恢复另一个作业本身的CPU时间。
例如,假设您有6个橙子和两只手,并且您必须共持有所有6个橙子5秒钟。假设需要一秒钟才能拿起或换掉橙子。您可以连续执行此任务,并在交换新对之前一次拾取两个橙子五秒钟。这会带你
1 + 5 + 1 + 5 + 1 + 5
= 3 * 5 + 3 = 18
秒完成。
现在假设并行比喻。然后所有6个橙子都乞求被拿起而你持有一个并不意味着你不会立即放弃它以换取替代品。我们已经定义了完成任务需要多长时间的上限,所以假设您必须在交换它们之前保持橙色至少2.5秒,并且您只需要成对交换。然后,它会带你
1 + 2.5 + 1 + 2.5 + 1 + 2.5 + 1 + 2.5 + 1 + 2.5 + 1 + 2.5 + 1
= 3 * 5 + 7 = 22
秒完成。请注意,通过" forking",每次持续5秒,持有6个橙子需要花费22%的时间。由于您有两只手,完成任务仍需要15秒,但根据您的策略,切换时间会有可变的开销。请注意,如果您有6只手,则只需7秒即可完成任务。
因此,当你有更多的处理器,fork进程,否则你只是在有限的硬件上处理工作。
答案 1 :(得分:1)
一般来说,你的简单问题在实践中极难回答。在现实生活中,我总是会测量,看看现实是否与我的理论一致。
现实与我的理论不符的一个例子是我的英特尔酷睿i7。它有4个核心并具有超线程。这表明并行运行8个线程将是最佳的:您将使用4个处理单元并使用4个额外的线程来保持管道填充。
但是,Core i7有6MB的共享缓存。事实就是如此,我的数据的工作集合适合6MB。所以我通过运行1个线程而不是2个甚至8个来看到极端的加速:运行超过1只会一直刷新缓存。如果没有共享缓存,则不会这样,但它只是表明并行化的速度更快时并不容易。