透過OpenMP撰寫平行化運算程式.以下是用Ubuntu 16.04 環境進行測試.

 

測試如何使用OpenMP的函式庫:

 

安裝相關編譯用套件

$ sudo apt install libomp-dev
$ sudo apt-get install clang 

test.c

#include "omp.h"
#include <stdio.h>

int main(void) {
  #pragma omp parallel
  printf("thread %d\n", omp_get_thread_num());
}

 

clang test.c -fopenmp

 


以下測試實際平行化運算下,是否能有所提昇.

 

loop_test.cpp

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

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

int main(int argc, char* argv[]){
    for( int i = 0; i < 10; ++ i )
        Test( i );

    std::cout << std::endl;
}

 

loop_test_parall.cpp

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

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

int main(int argc, char* argv[]){
    #pragma omp parallel for
    for( int i = 0; i < 10; ++ i )
        Test( i );
    std::cout << std::endl;
}

 

分別將兩個檔案進行編譯:

g++ loop_test.cpp -o a.out 
g++ loop_test_parall.cpp -o b.out -fopenmp

由實驗結果可以發現,由於還要額外增加分配之相關作業,因此若被分割的單元不夠複雜可能會造成效能反而下降.

並且可以看到由於分配到不同cpu執行,而cpu之間工作的切換是由作業系統決定的,因此會造成每個區段的時間不一.

因此再做平行化運算的時候須嚴加考慮,否則可能會出現難以預測的問題.

arrow
arrow
    文章標籤
    C C++ parallelism
    全站熱搜

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()