none
VB2008またはVB2010で並列化はできるのでしょうか RRS feed

  • 質問

  • 趣味のビリヤードを解析し、結果としてシュミレーターを作っているものです。Basicの延長で書いている初心者です。手玉の動きは書けた(スリークッションゲームとしては9割方目的を果たしています)のですが、衝突後の先玉の動きが同時に表わせていません(プログラムはあります)。C++では可能らしいのですが手が出ません。VBではできないのでしょうか。
    2012年10月12日 2:06

すべての返信

  • 現状実現できていること、実現したいができていないことをご自身で整理することをお勧めします。質問文から想像するに本当に必要なことは「並列化」ではないと思われます。
    2012年10月12日 3:34
  • 返信いただきありがとうございます。プログラムが進行してある時点である条件のもとで別のプログラムをスタートさせ描画を重ねたいのですが、これは並列化ではないのですか。C++の簡単なプログラムではOpenMPで並列化できたのですが。

    2012年10月12日 4:36
  • 外池と申します。具体的にどのようなプログラムを書こうとされているかは、よくわかりませんので、以下、ごくごく一般論です。

    VB2008やVB2010と指定されていますが、Visual Basicの言語の仕様というよりも、VB2008ないしVB2010のベースとなっている.Net Frameworkの機能として、「並列化」の方法がいくつか用意されています。

    あるプログラムから別のプログラムを起動し、データのやりとりをすることができます。「やりとり」のための手段が用意されています。(パイプ、リモーティング、ファイルわたしなど)

    また、ひとつのプログラムの中でも、処理をいくつかのスレッドに分けて実行することもできます。この場合、プログラムの中で変数を共有するなどしてデータの授受が出来ます。

    しかし、別のプログラムにするにせよ、ひとつのプログラムの別のスレッドにするにせよ、直接的に描画を「重ねる」ことはできません。描画は、ひとつのプログラムのひとつのスレッドでしかできません。なので、描画動作をしているプログラムのスレッドに、描きたい画のデータを渡してやる工夫が必要になります。

    -----------------------

    なお、率直なところ、私も「並列化」の必要性はあまり感じません。数個の「玉」の運動の計算は、1つのプログラムの1つのスレッドでも、おそらく十分高速に行えると思います。

    それよりも、リアルタイムでそれっぽく表示したいとお考えなら、「描画」を滑らかに行う工夫が大事であって、これは上述のとおり「並列化」とは関係がありません。

    • 回答の候補に設定 佐伯玲 2012年10月24日 6:32
    2012年10月12日 7:31
  • プログラムが進行してある時点である条件のもとで別のプログラムをスタートさせ描画を重ねたいのですが、これは並列化ではないのですか。

    大まかに全部できないというのではなく、この部分をもっと深くより具体的に掘り下げて、何が実現できていて何が実現できていないのか、その理解が必要と言っています。

    勝手な想像ですが、1つの玉の動作なら表現できる。2つの玉の動作を表現しようとすると1つ目の玉の情報が消えてしまう。そういった問題ではありませんか? もしそうなら並列化したところで1つ目の玉の情報が消えてしまうことに変わりはなく、求めているものは並列化とは無関係な「複数の玉を表現する方法」ということになります。
    # もしくはそもそも、そこまで考えてすらいない可能性もありますが。

    ですので、ご自身で何が必要なのかもう一度考え直すようお勧めしたのです。そうではなく並列化のみ必要とおっしゃるのでしたら、実現できているコードを提示してください。

    • 回答の候補に設定 佐伯玲 2012年10月24日 6:32
    2012年10月12日 21:54
  • OpenMPという言葉が出ていますので、以下をご紹介しておきます。
    「VB2008または」と書かれていますので、VB2010からしか使えないTPL (Task Parallel Library)をご存じないのかとも思いました。

    10 行でズバリ!! 並列プログラミング - TPL によるタスクの並列処理 (VB)
    http://code.msdn.microsoft.com/windowsdesktop/10-TPL-VB-bdf42dae


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 佐伯玲 2012年10月24日 6:32
    2012年10月15日 1:26
    モデレータ
  • こんにちは、3cplayer さん
    フォーラムオペレータの佐伯 玲 です。

    その後の状況はいかがでしょうか?
    追加でいただいている情報をご確認いただきうまくいかなかったり不明であったりした点があれば引き続きこちらのスレッドへご返信くださいませ。

    宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 佐伯 玲

    2012年10月23日 2:33
  • 超並列マシンの並列化を仕事の一つとしているものです。 VBでも並列化がてきるとなると、私もちょっと興味がありましのでのぞかせていただきました。

    3cplayerさんは、衝突後の複数のプログラムを単独にシミュレートして別のプロセスで計算したいのですよね。

    もちろん、並列化を使わなくても目的は達成できるとは思いますが、3cplayerさんの発想は間違ってはいません。

    立派な並列化ですよ。 コンカレントやパラレルなど定義が色々とありますが、並列化の粒度は違えど、異なったCPUで分散して速く計算したい、または他のクローン的にクラスをあまり変更せず再利用したい点では、本質は同じです。

    並列化の目的はただ速く計算したいというだけではないですからね。

    言われているものは、モンテカルロ法の宇宙線カスケード電子シャワーなどの計算でよく似たものがあります。

    ただ、ビリヤードの玉同士の再衝突判定など同期は必要なので難しいかもしれません・・・(素粒子ではこれがほとんどないので無視できます)

    伝統的な並列化手法には、メモリ共有(OpenMP こっちの方が簡単)と分散メモリ(MPI)がありますが、仰るものはMPIよりOpenMPのような方法のが向いていると思います。 もっと新しいものもいくつかあります。

    VBの並列化は知りませんが、これらが使えると嬉しいですね。


    hokesI

    2012年10月29日 19:18
  • VBというか.NETの並列処理に興味がおありとのことですので、いくつか紹介したいと思います。

    .NET Framework の並列プログラミングで並列処理のライブラリに関して情報がまとまっています。これはVS2010 / .NET 4で導入されたもので、大まかに言ってTPL; タスク並列ライブラリとPLINQ; Parallel Linqがあります。

    これらのベースとなっている機能はネイティブのC++にも公開されていて、同時実行ランタイムにまとめられています。こちらもVS2010からとなります。そのほか、VS2012では自動並行化と自動ベクター化C++ AMPも導入されました。

    これらを支援するためにOS側にはWindows 7 64bitからUser-Mode Schedulingなんかも提供されています。

    2012年10月29日 23:14
  •  まだ見ていらっしゃれば良いのですが。。。

    手玉の動きは書けた(スリークッションゲームとしては9割方目的を果たしています)のですが、衝突後の先玉の動きが同時に表わせていません(プログラムはあります)。

    プログラムが進行してある時点である条件のもとで別のプログラムをスタートさせ描画を重ねたい

     引用した2文から、動いている玉の数だけスレッドを作ろうとされているように思いました。
     例えば、手玉が赤玉にあたったら、そこから手玉を動かすスレッドと、赤玉を動かすスレッドに分ける、そのようなイメージでしょうか。

     では、ちょっとお尋ねしたいのですが、手玉と、動いている赤玉がぶつかったら、どの様に処理するおつもりでしょうか。また、スレッドにすると、手玉の位置計算と赤玉の位置計算は、時間的に独立して行われます。手玉が「次の移動位置で、赤玉にぶつかるか?」を知ろうとしたときに、赤玉が同じ時間を計算しているとは限りません。この時間の同期は、どのようにしようとお考えでしょうか。

     同期が取れるとして、スレッドを分ける方法を考えます。いま、おそらく、キューで手玉を突くところから、手玉の位置計算が始まっていると思います。ここを変えてみてはどうでしょうか。つまり、「キューで突いたから手玉が動く」ではなく、手玉が動き出す動機を「キューという第4(あるいは5)の玉が手玉にあたった」と考えるといかがでしょうか。あるいは、玉というオブジェクトが、運動量を受け取るようにしてはいかがでしょうか。
     同期が取れ、手玉が動く動機についての視点が変えられれば、スリークッションゲームならば玉はたかだか3つないし4つなので、最初からスレッドを作っておいても良いでしょう。つまり、最初は運動量0で動いている、ということです。


    Jitta@わんくま同盟

    2012年11月1日 13:43