スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[c++] OpenMP

2007-08-31 | 20:35

OpenMPを使うとpragmaディレクティブの指定だけで処理をスレッドに分割できる。

#pragma omp for でfor ループ内で行われる動作をスレッドに分割

試してみたプログラム (2乗して平方根をとるという処理を1000万回繰り返す関数を10回呼び出している。もちろん処理の内容には意味はない)
Visual studio 2005で確認

#include "stdafx.h"
#include <omp.h>
#include <iostream>
#include <math.h>
#include <time.h>

void foo(){
    std::cout << omp_get_num_threads() << std::endl;
    std::cout << "#" << omp_get_thread_num() << std::endl;
    double result = 0;
    for(int i = 0 ; i < 10000000 ; i++)
        result = sqrt(pow((double)i,2));
}

int _tmain(int argc, _TCHAR* argv[])
{
    clock_t start = clock();
    #pragma omp parallel for
    for(int i = 0 ; i < 10 ; i++)
        foo();
    clock_t end = clock();
    std::cout << (end-start) << std::endl;
    return 0;
}
マシンのCPU数は2
#pragma omp を指定しなかった場合、処理にかかった時間は22.703秒。CPUも片方だけが100%になっており、もう片方は使われていない。
#pragma ompを指定した場合(コンパイル時に、/openmpを指定)、処理にかかった時間は15.516秒。CPUの使用率も両方100%になっている。

プログラム実行の出力は次のとおり
22

##10

2
#1
2
#0
2
#1
2
#0
2
#1
2
#0
2
#1
2
#0
15516
最初に 22 ##10
となっているのは、2,#1,2,#0 となるべきところが、平行して実行されているために出力が混在しているため。
このことからもfoo()が並列して実行されていることがわかる。


#pragma omp section で関数レベルで並列化する

int _tmain(int argc, _TCHAR* argv[])
{
    clock_t start = clock();
   
    #pragma omp parallel sections
    {
        #pragma omp section
        foo();
        #pragma omp section
        foo();
    }
    clock_t end = clock();
    std::cout << (end-start) << std::endl;
    return 0;
}

スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。