如何在普通PC上进行多核编程

随着单核计算能力的不断的被挖掘,单核计算性能提升的潜力在不断的减少。为了进一步提升PC的计算能力,使用多核的CPU不失为一种明智的选择。

多核CPU不再通过提升指令级指令的并行计算来获得性能的提升,而是通过多个核(实质上就是多个微型的CPU)的并行计算来提高CPU的性能。这种CPU能支持物理层的并行计算。这使得并行计算成为了计算机发展新时期的重要的研究方向。

以前的程序设计绝大多数都是串行的,也就是指令流的执行在同一时间周期内,只能执行一条指令。然而这是否意味着串行化的程序设计不支持并行计算呢?答案是否定的。很简单的,只要你有一个N核的CPU,你就可以通过线程的创建来实现并行计算(最适合创建的线程数与核的数目相等------现阶级主要是双核的,所以你要充分使用计算机的计算能力,创建双线程进行并行计算,是最为合理的)。

-----原理:操作系统将这些相互独立的线程分配给不同的处理机(CPU单核)进行并行处理。

------这些结论当然不是我夸夸其谈的啦,我是做过相当测试的。测试的代码很简单,创建一个WIN32程序.在里面设置如下:当选择不同的菜单选项时,可以分别选择创建不同数目的线程进行不间断计算(死循环)。关键代码可见文未。

实验结果表明:

当N=0时,创建的线程数为0,CPU利用率为系统闲置时的利用率,10%左右。

当N=1时,创建的线程数为1,CPU利用率达到 60%左右

当N=2时,创建的线程数为2,CPU利用率达到 100%,此时系统反应相当缓慢了,窗口的拖拉变得相当迟缓。

当N=3,10时,创建的线程数为3,10,CPU利用率依然为100%

。。。。。。。

(这是在配置为VISTA终极版,CPU为AMD 3600+(双核) 内存为2G(跟内存无关的) 下的实验结果   )

这个实验结果也让我想到了我以前的扫雷程序------使用了多线程,从而解决了因界面绘制时间过长,而造成程序易于崩溃的问题。这就是使用串行化语言(C++)编写的并行化程序啊,感慨中。。

附线程的创建与销毁程序如下:

     case ID_N0:
       for(i=0;i<N;i++)
        TerminateThread(id[i],0);
       N=0;
       break;
     case ID_N1:
        if(N>1)
         for(i=1;i<N;i++)
          TerminateThread(id[i],0);
       else
        for(i=N;i<1;i++)
         id[i]=CreateThread(0,0,ThreadProc,0,0,0);
       N=1;
       break;
     case ID_N2:
       if(N>2)
         for(i=2;i<N;i++)
          TerminateThread(id[i],0);
       else
        for(i=N;i<2;i++)
         id[i]=CreateThread(0,0,ThreadProc,0,0,0);
       N=2;
       break;
     case ID_N3:
       if(N>1)
         for(i=1;i<N;i++)
          TerminateThread(id[i],0);
         else
        for(i=N;i<3;i++)
         id[i]=CreateThread(0,0,ThreadProc,0,0,0);
       N=3;
       break;
     case ID_N10:
       if(N>1)
         for(i=1;i<N;i++)
          TerminateThread(id[i],0);
       else
        for(i=N;i<10;i++)
         id[i]=CreateThread(0,0,ThreadProc,0,0,0);
       N=10;
       break;

线程代码如下:

DWORD WINAPI ThreadProc (PVOID pParam)
{
int i=0;
while(1) //死循环计算,直到线程中止!
   i++;
return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值