gpt4 book ai didi

c++ - 线程运行时间、cpu上下文切换和性能之间的关系

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:09 25 4
gpt4 key购买 nike

我做了一个实验来模拟我们的服务器代码中发生的情况,我启动了 1024 个线程,每个线程都执行一个系统调用,这需要大约 2.8 秒才能在我的机器上完成执行。然后我在每个线程的函数中添加 usleep(1000000) ,执行时间增加到 16 秒,当我第二次运行相同的程序时,时间将减少到 8 秒。我猜这可能是由 cpu 缓存和 cpu 上下文切换引起的,但我不太确定如何解释它。

此外,避免这种情况发生的最佳实践是什么(稍微增加每个线程的运行时间会导致整个程序性能下降)。

我在此处附上了测试代码,非常感谢您的帮助。

//largetest.cc
#include "local.h"
#include <time.h>
#include <thread>
#include <string>
#include "unistd.h"

using namespace std;

#define BILLION 1000000000L

int main()
{

struct timespec start, end;
double diff;

clock_gettime(CLOCK_REALTIME, &start);

int i = 0;
int reqNum = 1024;

for (i = 0; i < reqNum; i++)
{
string command = string("echo abc");
thread{localTaskStart, command}.detach();
}

while (1)
{
if ((localFinishNum) == reqNum)
{
break;
}
else
{
usleep(1000000);
}
printf("curr num %d\n", localFinishNum);
}

clock_gettime(CLOCK_REALTIME, &end); /* mark the end time */
diff = (end.tv_sec - start.tv_sec) * 1.0 + (end.tv_nsec - start.tv_nsec) * 1.0 / BILLION;
printf("debug for running time = (%lf) second\n", diff);

return 0;
}
//local.cc
#include "time.h"
#include "stdlib.h"
#include "stdio.h"
#include "local.h"
#include "unistd.h"
#include <string>
#include <mutex>

using namespace std;

mutex testNotifiedNumMtx;
int localFinishNum = 0;

int localTaskStart(string batchPath)
{

char command[200];

sprintf(command, "%s", batchPath.data());

usleep(1000000);

system(command);

testNotifiedNumMtx.lock();
localFinishNum++;
testNotifiedNumMtx.unlock();

return 0;
}

//local.h


#ifndef local_h
#define local_h

#include <string>

using namespace std;

int localTaskStart( string batchPath);

extern int localFinishNum;
#endif

最佳答案

localFinishNum 的读取也应该受到互斥体的保护,否则结果将无法根据线程调度的位置(即在哪些核心上)、缓存何时以及如何失效等因素来预测。

事实上,如果编译器决定将 localFinishNum 放入寄存器(而不是始终从内存中加载),则在优化模式下编译该程序甚至可能不会终止。

关于c++ - 线程运行时间、cpu上下文切换和性能之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826791/

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