如何在普通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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章