WEB开发网
开发学院软件开发C语言 玩转双核CPU:左手画圆,右手画方 阅读

玩转双核CPU:左手画圆,右手画方

 2010-09-30 22:43:19 来源:WEB开发网   
核心提示: 继续发散,刚才的例子,玩转双核CPU:左手画圆,右手画方(3),如果是运行69毫秒,睡觉50毫秒呢?那么当前的100毫秒CPU占用率仍然会是69%,真不好意思,我暂时还没有想到一个足够说服大家、可以公式化的调整办法,但如果算法不加调整,仍然以100毫秒为一个平均值节点

继续发散。刚才的例子,如果是运行69毫秒,睡觉50毫秒呢?那么当前的100毫秒CPU占用率仍然会是69%,但如果算法不加调整,仍然以100毫秒为一个平均值节点,这就影响到了下一个100毫秒的CPU占用率。前一个影响后一个,如多米诺骨牌一样,整体的曲线就完全错误了。

也就是说,我们用来控制CPU平均占用率的时间段,每段必须相等。

我们考虑到以上的代码中,在1号CPU中运行了69毫秒,剩下了31毫秒如果转到2号CPU中运行,1号CPU的占用就会降到0,但与此同时我们就可以在2号CPU中“画方”了。

概括起来说就是,当1号CPU小寐的时候,程序在2号CPU中“画方”;1号CPU小寐结束的时候,2号CPU中当前周期的“方”必须完成。

需要注意的是,假如1好CPU画了69毫秒,那么2号CPU一定只能画31毫秒。

按照这个思路,我们先实验一下简单的:在1号CPU中画正弦曲线后的休息时间段,我们在2号CPU中画余弦曲线。呵呵,初中学的三角函数你忘了吗?

我们将原代码中的空循环改为:

      while (true) 
      { 
        j = j % COUNT; 
        p.ProcessorAffinity = (IntPtr)0x0001; 
        startTime = Environment.TickCount; 
        while ((Environment.TickCount - startTime) <= busySpan[j]) ; 
        p.ProcessorAffinity = (IntPtr)0x0002; 
        while ((Environment.TickCount - startTime) <= idleSpan[j]) ; 
        j++; 
      }

“左手正弦,右手余弦”结果差强人意:

我们注意到这个曲线没有之前单CPU运行时那么精确的。

原因是我们切换CPU的运营占用了时间。例如,以前正弦画了69毫秒,我们计算出余弦应该画31毫秒,但切换CPU的操作可能占用了3毫秒(或更多、或每次耗时都不同),整体就不在100毫秒这个间隔范围了,所以曲线结果有误差。

到这里,我的思路已经说完了,相信大家已经明白。

不过, 走到这一步,追求完美的我们,的确是遇到了一点障碍。

我经过一些周期上的微调,并且将余弦函数改为了简单的方波函数,最终效果正如本文开头展示的一样,还是不错的。

调整办法?呵呵,真不好意思,我暂时还没有想到一个足够说服大家、可以公式化的调整办法,就请各位看官在这里八仙过海,各显神通咯~

上一页  1 2 3 

Tags:CPU 左手 右手

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接