gpt4 book ai didi

c++ - 为什么两个核上的两个实例的运行时间比单个实例的运行时间要大?

转载 作者:行者123 更新时间:2023-11-30 17:47:52 24 4
gpt4 key购买 nike

我面临着一个“也许”奇怪的问题。假设我有一个可执行文件。当我在具有两个内核的计算机上运行它时,该进程运行时间为 t1。然后,如果我运行该进程的两个实例(相同的可执行文件,但在不同的目录上,手动启动或使用 gnu 并行启动),每个进程的运行时间并不接近 t1,但实际上更大,有时接近 1.9t1。我必须指出,这两个核心是物理的(macbook pro 2009 年中,Mountain Lion)。我还在 8 核 Linux 机器上测试了这种行为。如果我运行 1、2、3、4 个实例,每个实例的运行时间约为 t1。但是,在 5、6、7 和 8 个实例之后,每个实例的运行时间逐渐大于 t1。

我在运行模拟时检测到了这种行为。我能够将测试用例简化为下面介绍的简单测试。我想在多个编译级别检查 std::vectorstd::array、静态和动态数组。测试代码如下:

#include <iostream>
#include <vector>
#include <array>
#include <cstdlib>

struct Particle {
private:
int nc;
public:
void reset(void) { nc = 0; };
void set(const int & val) { nc = val; };
};

#define N 10000 // number of particles
#define M 200000 // number of steps

#define STDVECTOR 0
#define STDARRAY 0
#define ARRAY 1
#define DYNARRAY 0

int main (void)
{
#if STDVECTOR
std::vector<Particle> particles(N);
#elif STDARRAY
std::array<Particle, N> particles;
#elif ARRAY
Particle particles[N];
#elif DYNARRAY
Particle *particles; particles = new Particle [N];
#endif

int jj = 0;
for (int ii = 0; ii < M; ++ii) {
//for (auto & body : particles) body.reset();
for (int idx = 0; idx < N; ++idx) particles[idx].reset();
jj = ii;
}
particles[0].set(jj*drand48());

return 0;
}

编译测试的完成方式为

for a in 0 1 2 3;执行 printf "\n\nOPT=$a\n\n"; g++-4.8 -O${a} -o tmp.x tmp.cpp; cp tmp.x simul01/; cp tmp.x simul02/;时间 simul01/tmp.x ;并行 'time {}/tmp.x'::: simul01 simul02 ;完成

对于两核机器,我得到以下数据: Running times or one and two processes

其中时间以秒为单位,例如, vector 1 或 vector 2 分别表示使用 std::vector 并运行一个或两个进程时的运行时间。对于这两个过程,我花费了两者之间最大的时间。

我的期望:我期望两个进程的运行时间与单个进程的时间相似。但是,当运行多个实例时,即使核心数量足够,时间也会系统性增加。正如我所说,当进程数大于 4 时,八核机器也会发生这种情况。

我如何测量时间:我使用time命令,并选择用户时间。系统时间太小,不足以解释一两个进程运行时的差异。

我已经检查过 gcc 4.6、4.7、4.8 和 4.9。

因此,我的问题是:为什么会发生这种情况?可能与操作系统的某些固有特性以及进程从核心到核心的迁移有关。我真的不知道。如果有人能够阐明这一点,我非常感激,因为这会影响我的模拟的运行时间。我需要同时运行多个进程,但运行时间不断增加。相比之下,另一个采用不同方法的模拟代码对于一个和两个进程的运行时间大约相同。所以我想放弃或确保这是我自己的程序的问题。我也不知道如何以可移植的方式(在 mac 和 linux 之间)设置处理器亲和性。

提前致谢

最佳答案

请记住,还有其他任务与您的应用程序一起运行(内核线程、后台进程等...)在 2 个核心上引入另一个 CPU 密集型任务意味着可能会出现跨核心的线程迁移,并且本质上它们正在争夺资源。对于更多核心的Linux场景也是如此。一旦达到一定的限制,那么您将与系统上的其他进程竞争,无论是您生成的进程还是后台进程和内核线程等......

关于c++ - 为什么两个核上的两个实例的运行时间比单个实例的运行时间要大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18776518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com