在C+中模拟CPU负载+; 我目前正在用C++编写Windows应用程序,我想模拟CPU负载。
我有以下代码:在C+中模拟CPU负载+; 我目前正在用C++编写Windows应用程序,我想模拟CPU负载。,c++,cpu,cpu-usage,C++,Cpu,Cpu Usage,我有以下代码: void task1(void *param) { unsigned elapsed =0; unsigned t0; while(1){ if ((t0=clock())>=50+elapsed){//if time elapsed is 50ms elapsed=t0; Sleep(50); } } } int main(){ int ThreadNr; for(int i=0; i < 4;i+
void task1(void *param) {
unsigned elapsed =0;
unsigned t0;
while(1){
if ((t0=clock())>=50+elapsed){//if time elapsed is 50ms
elapsed=t0;
Sleep(50);
}
}
}
int main(){
int ThreadNr;
for(int i=0; i < 4;i++){//for each core (i.e. 4 cores)
_beginthread( task1, 0, &ThreadNr );//create a new thread and run the "task1" function
}
while(1){}
}
void task1(void*param){
无符号经过=0;
未签名t0;
而(1){
如果((t0=clock())>=50+经过){//如果经过的时间是50ms
经过=t0;
睡眠(50);
}
}
}
int main(){
int-ThreadNr;
对于(int i=0;i<4;i++){//每个核(即4个核)
_beginthread(task1、0和&ThreadNr);//创建一个新线程并运行“task1”函数
}
而(1){}
}
我使用与本文中给出的答案相同的方法编写了此代码:
我的问题是:
我把C代码从另一个帖子正确翻译成C++?< /LI>
是否有人知道我如何生成上述负载,但仍然能够在不同的计算机上使用我的程序(即使用不同的CPU)?您可以使用Windows获得CPU负载。无论是对于整个系统还是对于整个进程,
乍一看,这看起来都不漂亮,但正确的C++或C(一种简单的方法是编译它)。缺少include(
、
和
),但在其他方面它编译良好
请注意,clock
和Sleep
不是非常准确,而且Sleep
也不是非常可靠。平均而言,线程函数应该按照预期的方式工作(给出或接受百分之几的变化)
但是,关于问题2),您应该用阻塞而不是旋转的东西(例如WaitForSingleObject
或Sleep
,如果您愿意的话)替换最后一个,而(1){}
。否则,整个程序将不在四核上有50%的负载。由于主线程的原因,一个内核将有100%的负载,加上四个工作线程的4倍50%。这显然会使每个内核的总开销超过50%(并且会导致线程从一个内核反弹到另一个内核,导致严重的副作用)
使用任务管理器或类似的实用程序来验证是否获得了所需的负载是一个不错的选择(因为这是最简单的解决方案,也是最好的解决方案)
还要注意的是,以这种方式模拟负载可能会有很多工作,但不是100%可靠。可能存在难以预测的影响(内存、执行单元)。例如,假设您在这个循环中使用100%的CPU整数执行单元(合理的假设),但它的浮点或SSE单元为零。现代CPU可能在真实或逻辑内核之间共享资源,您可能无法准确预测您得到的效果。或者,另一个线程可能内存不足或存在严重的页面错误,因此占用CPU时间不会像您想象的那样对其产生太大影响(实际上可能会给它足够的时间使预取工作更好)。或者,它可能会阻止AGP传输。或者,你说不出的其他事情 编辑: 改进的版本,更短的代码,修复了一些问题,也可以按预期工作:
- 使用
作为clock\t
返回的值(从技术上讲,这是“更正确的”而不是使用非特定的clock
'd整数。顺便说一句,这可能就是原始代码不能按预期工作的原因,因为在Win32下typedef
是一个有符号整数。clock\t
总是计算if()中的条件
,因此工作人员几乎一直在睡觉,不消耗CPUtrue
- 代码越少,旋转时的数学就越简单。在未来计算50次唤醒时间,并旋转直到达到该时间
- 使用
在结束时阻止程序。这不会消耗CPU时间,并且允许您通过按Enter键结束程序。线程不会像通常那样正确结束,但在这种简单的情况下,在进程退出时让操作系统终止线程可能没问题getchar
<> LI>与原始代码一样,假设 - 与原始代码一样,它依赖于函数(
和clock
),这些函数不精确且不可靠。Sleep
在我的系统上等于Sleep(50)
,而不使用Sleep(63)
。然而,该程序工作“几乎完美”,导致我的机器上有50%+/-0.5%的负载timeBeginPeriod
- 与原始代码一样,这不考虑线程优先级。具有高于正常优先级类的进程将完全不受此限制代码的影响
#包括 #包括 #包括 #包括 作废任务1(作废*) { 而(1) { 时钟唤醒=时钟()+50; while(clock()
boost::thread
,或者C++11std::thread
),因此,如果要实现非Windows可移植性,无论如何都必须重新考虑
- 这是一个代码示例,它在Windows上将我的CPU加载到100%
#include "windows.h"
DWORD WINAPI thread_function(void* data)
{
float number = 1.5;
while(true)
{
number*=number;
}
return 0;
}
void main()
{
while (true)
{
CreateThread(NULL, 0, &thread_function, NULL, 0, NULL);
}
}
当您构建应用程序和
#include "windows.h"
DWORD WINAPI thread_function(void* data)
{
float number = 1.5;
while(true)
{
number*=number;
}
return 0;
}
void main()
{
while (true)
{
CreateThread(NULL, 0, &thread_function, NULL, 0, NULL);
}
}