忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[323]  [322]  [321]  [320]  [319]  [318]  [317]  [316]  [315]  [314]  [313
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

実は記事のタイトルはでたらめで,僕の腐敗神話を延々と書くのが今日の記事の内容です.


・・・まあ,そんな誰が得するか分からない嘘は置いといて,今回は前回作成した実行コンテキストをいぢってみます.


今回のサンプルはここからダウンロード出来ます.


サンプルでは,OpenMPを使って複数のRTCを並列かつ同期的に処理するようにしています.

複合コンポーネントでは,ひとつのECで複数のRTCが駆動できるようになってます.

普通に複合コンポーネントを作成したら,直列実行になるみたいですね,多分,

でも,論文読んでみた感じ,同期的かつ並列実行もできるみたいに書いてますけど,今その機能があるのか,あってもどこで設定するのかを僕は知らないのでOpenMPで自作しました.

駆動するRTCの処理をするスレッドの開始時刻は同じになるので,同期的かつ並列になるはずです.

・・・・RTCの数が少ないときはですけど.

おそらく,複合するRTCが多すぎると同一スレッドで複数のRTCを処理すると思います.


VC2008EEでOpenMPを使用したプログラムを作成するにはWindows SDK for Windows Server 2008 and .NET Framework 3.5が必要です.Proffesionalとかなら要らないみたいです.

プロジェクトの作成の際は,プロパティ→C/C++→言語のOpenMPサポートをはいに変更してください.




今回作成したサンプルの使用方法を説明します.

まず,MPExecutionContextManagerのReleaseフォルダに入っているMPExecutionContextManager.exeを起動してください.

すると,マネージャが登録されます.


そして,今回はTest1とTest2のフォルダのcomponentsフォルダにテスト用RTCを用意したので,Test1CompとTest2Compを起動してください.

そして,複合コンポーネント作成時に出てくるダイアログのManagerを先ほど起動したマネージャに設定して複合コンポーネントを作ってください.

これで完了です.複合コンポーネントを作成すると,マネージャのコンソール画面に処理時間が表示されます.

非アクティブの時は0.00となるはずです.


ここで,アクティブにしてみます.

すると,経過時間が変化するはずです.

ちなみに,僕の環境では0.3秒ぐらいかかります.




これでは比較ができないので,一旦マネージャとRTCを終了させてから「並列処理無し」という名前のフォルダに入ってるMPExecutionContext.dllというDLLをマネージャのフォルダにコピーしてから実行してください.


・・・・としようと思ったのですが,複合コンポーネントを解除しようとするとバグりますね.

あまりよろしくないですが,コンソールの×を押して消しましょう.

一体,どこがおかしいんでしょうね?
実行コンテキストではないようですが.



それで実行するとさっきより遅くなると思います.

ちなみに僕の環境では0.6秒近くかかります.

元に戻すときはMPExecutionContextのフォルダのReleaseにあるMPExecutionContext.dllをさらに上書きしてください.


さて,今回のソースを見てみます.

以下はMPExcutionContextのMPExecutionContext.cppのソースの一部です.



#include <omp.h>  //OpenMPを使うためのヘッダー


int MPExecutionContext::svc(void)
{
     
      do{
            clock_t start,end;  //時間測定のための変数
            start = clock();  //開始時間

            #pragma omp parallel  //この指示文以降のブロックをマルチスレッドで実行
            #pragma omp for   //forループをスレッド間に分割
            for(int i=0;i < m_comps.size();i++)
            {
                invoke_worker()(m_comps[i]);  //i番目のRTCの処理実行
            }

            end = clock();  //終了時間
            printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);  //時間表示
           
      }while (m_running);

   
    return 0;
}



といった感じです.

今回のサンプルでは実行周期を指定できないので,できるようにすべきがどうかは考え中です.

需要があればやろうと思いますけど,僕が見逃してるだけで実は並列にも設定できるとかだったら怖い.





あ,そうそう.

卒論発表の終わる25日まで更新できません.

1日1回更新すると言っといて無責任ですが,25日からは更新するつもりなので勘弁してください.










にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新CM
[08/31 ysuga]
[08/31 Nobu]
[08/31 ysuga]
[12/11 Nobu]
[12/11 Kanamura]
最新TB
プロフィール
HN:
Nobu
年齢:
35
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]