创建具有> 70%CPU利用率的线程

时间:2009-01-19 07:26:43

标签: c++ windows

我正在创建一个测试程序来测试程序的功能,它计算CPU利用率。

现在我想在CPU利用率为100%,50%0%等的不同时间测试该程序。

我的问题如何使CPU利用到100%或者可能是> 80%。

我认为创建一个while循环就足够了

while(i++< 2000)
{
   cout<<" in while "<< endl;
   Sleep(10); // sleep for 10 ms.
}

运行之后,我的CPU利用率不高。 什么是可能的解决方案,使高CPU密集??

7 个答案:

答案 0 :(得分:7)

你使用循环是对的,但是:

  • 你有IO
  • 你已经睡了

基本上该循环中的任何内容都不会占用CPU时间,而不是它正在睡觉或等待IO的时间。

要杀死CPU,你需要给它只是 CPU的东西。唯一棘手的问题是确保C ++编译器不会优化循环。这样的事可能应该没问题:

// A bit like generating a hashcode. Pretty arbitrary choice,
// but simple code which would be hard for the compiler to
// optimise away.
int running_total = 23;
for (int i=0; i < some_large_number; i++)
{
    running_total = 37 * running_total + i;
}
return running_total;

请注意我正在将值返回循环。这应该阻止C ++编译器注意到循环是无用的(如果你从未在任何地方使用过这个值,那么循环没有用处)。您可能也想要禁用内联,否则我猜智能编译器可能会注意到您在不使用返回值的情况下调用函数,并将其内联到任何内容。 (正如Suma在答案中指出的那样,在调用函数时使用volatile应禁用内联。)

答案 1 :(得分:4)

你的循环主要是睡眠,这意味着它的CPU负载非常轻。除了Sleep之外,一定要包含一些执行任何计算的循环,例如(Factorial实现留给读者练习,你可以用任何其他非平凡函数替换它)。

while(i++< 2000)
{
   int sleepBalance = 10; // increase this to reduce the CPU load
   int computeBalance = 1000; // increase this to increase the CPU load
   for (int i=0; i<computeBalance; i++)
   {
     /* both volatiles are important to prevent compiler */
     /* optimizing out the function */
     volatile int n = 30;
     volatile int pretendWeNeedTheResult = Factorial(n);
   }
   Sleep(sleepBalance);
}

通过调整sleepBalance / computeBalance,您可以调整此程序占用的CPU数量。如果您希望将其作为CPU负载模拟,您可能需要采取一些额外的步骤:

  • 在多核系统上,请确保在多个线程(每个CPU一个)中生成这样的循环,或者多次执行该进程,并使调度可预测明确地分配线程/进程关联
  • 有时您可能还希望增加线程/进程优先级,以模拟CPU负载较重的高优先级应用程序的环境。

答案 2 :(得分:3)

在Windows SDK中使用consume.exe。

当别人已经完成工作并且将免费赠送给你时,不要自己动手。

答案 3 :(得分:1)

如果你在循环中调用Sleep,那么循环的大部分时间将用于无所事事(休眠)。这就是你的CPU利用率很低的原因 - 因为与CPU在每次循环迭代中执行其余代码所花费的时间相比,10mS睡眠是巨大的。编写代码以准确地浪费CPU时间是一项非常重要的任务。 Roger建议使用CPU Burn-In是一个很好的建议。

答案 4 :(得分:1)

要使线程使用大量CPU,请确保它不会阻塞/等待。您的睡眠呼叫将暂停该线程,并且不会将其安排至少睡眠呼叫指示的毫秒数,在此期间它将不使用该CPU。

答案 5 :(得分:1)

我知道UNIX系统上的“是”命令,当路由到/ dev / null时,单个内核会占用100%的CPU(它没有线程)。您可以启动它的多个实例以使用每个核心。您可以在应用程序中编译“是”代码并直接调用它。您没有指定用于Windows的C ++编译器,但我将假设它具有某种类型的POSIX兼容性(ala Cygwin)。如果是这种情况,“是”应该可以正常工作。

答案 6 :(得分:0)

获取CPU Burn-In

的副本