2011年6月29日 星期三

讓程式更快 - 多核心處理器

首先工作上遇到 model 越跑越慢的情況 (大家的 c code 都隨便寫XD)

那只好用繼續想辦法榨出硬體效能
先想辦法把 CPU 多核心的能力用上

使用 OpenMP
但是發現 VC++ 6 不支援
看起來要更新了 但是之前安裝的 VS2008 win32一直跑不起來 rc.exe mt.exe 找不到
一口氣全部解決 安裝
Windows SDK for Windows Server 2008 and .NET Framework 3.5



可以用後就想把 VC++ 6 的程式 porting 到 VS2008 去


#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <tchar.h>

void Test( int n )
{
 for( int i = 0; i < 999999999; ++ i )
 {
  //do nothing, just waste time
 }
 printf( "%d, ", n );
}

int main(int argc, char* argv[])
{
    clock_t start_time, end_time;
    float total_time = 0;

    start_time = clock(); /* mircosecond */

    #pragma omp parallel for
    for( int i = 0; i < 10; ++ i )
        Test( i );

    end_time = clock();
    total_time = (float)(end_time - start_time)/CLOCKS_PER_SEC;

    printf("Time : %f sec \n", total_time);

}


執行結果
5, 0, 6, 1, 7, 2, 8, 3, 9, 4, Time : 26.672001 sec
請按任意鍵繼續 . . .

久違的 100% CPU使用率

如果把紅色的 code 拿掉會變成
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, Time : 42.844002 sec
請按任意鍵繼續 . . .

只用到一顆核心在跑 右邊那顆


ps. 在 debug mode 上述的 code 才可以測試 因為迴圈是空的 在 release mode 這種迴圏會被最佳化

至於 NVidia 的 CUDA ... 恩 先讓我弄到張 8系列以上的顯卡吧 Orz
ps2. OpenMP on VC6 其實 VC6 也可以用 OpenMP, 只是好像是把 compiler 換掉了 XD

沒有留言:

張貼留言

開放匿名留言 請大家注意網路禮儀