• 締切済み

個人PCで並列計算ができるか?速くなるか?

並列計算を個人のPCで行って計算速度が上昇するか、また容易に並列計算ができるかについて伺いたいです。特に知りたいことは (1)プロセッサによらず並列計算をすると速くなるものか?どのプロセッサが速くなりやすいとかありますか? (2)初心者でもとっつきやすい並列計算ができるソフト、ライブラリは何か?(いくつか候補をあげてそれぞれの利点を説明して下さると有り難いです) (3)計算がどれくらい速くなるか? 以下状況と質問内容を具体的に説明します。 現在私の利用可能なプロセッサがCoreDuoのノートPC1つ、Core2Duoのデスクトップが1つです。(後者は学校にあるものなので、勝手にノートとつないで両方で計算させることができるかは不明ですが。。。)(1)についてはこのプロセッサではどうかを特に教えて頂きたいです。 今現在数値的にやらなくていはいけない処理は、行列の積、逆行列、および固有値を求めることです。行列が複素数であり、疎でもないですし、かなり行列のサイズが大きい(100×100以上にはなる)ので困ってます。 将来的にはモンテカルロ法にもお世話になるので、「行列演算」「モンテカルロ」について並列計算でどれくらい速くなるか(3)で教えて下さると助かります。 何卒よろしくお願い致します。

みんなの回答

  • cynthia4
  • ベストアンサー率51% (186/358)
回答No.3

Linux(CentOS 5)で計算機ネットワーク http://www.rcs.arch.t.u-tokyo.ac.jp/kusuhara/tips/linux/cluster.html http://www.cs.hiroshima-u.ac.jp/~yasuaki/dokuwiki/doku.php?id=start 以上は、悪いけど、直ぐには無理だと思います。 Linux を知らなければ、一年くらいかかるか?? 金をかければ、出来るかも知れません。中途半端な金額ではない。 http://www.intel.co.jp/jp/software/products/index.htm Xeon,Itanium ならもっと良いかも知れない。 しかし、この辺は知りません。そんな金はないので だから、こつこつLinux をやっています。 初心者で簡単な方法があるのなら、私も知りたい。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

x毎に固有の処理を行うのであれば、xをパラメータ (範囲指定でも)として、複数ジョブを走らせる、 並列して同じプログラムを別の値で走らせたら、 CPUのコアが複数あれば、並列で処理してくれるで しょう。これが最も単純で、最も効果があると 思えます。 ただし、同時に走らせるジョブ数をコア数以上にす ると逆効果になるかもしれません。コア数マイナス 1個のジョブ数が望ましいですね。 プログラム内で並列処理するのは、コストが掛かる し、効果が期待できるようになる前に、スカラで 処理が終わってしまうかもしれないという代物で しょう。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

結論を先に書くとPCでは無理と思います。 やはりスーパーコンピュータ。スーパーコン ピュータ用のコンパイラが必要でしょう。 コンパイラは、スーパーコンピュータのハー ド特質が分かっているし、また、プログラマ もスーパーコンピュータ毎のハード的特質を 把握する必要があります。 スーパーコンピュータによっては繰り返し演 算が128回で最も性能が出るものや、256回で 最も性能が出るものなど、色々です。多くの 性能に影響する要素があり、意味の無いピー ク性能を引出すだけのテストプログラムでさえ ピーク性能を引出せる人は、そうは居ません。 また、ベクトル演算を行うためには一般的に コスト(性能的にマイナス)があります。 専用マシンでなければそのコストはとても 回収できません。専用マシンでも、演算アル ゴリズムが悪ければ、コスト割れしてしまい、 スカラ演算より遅くなるケースもあります。 PCごときでは、素直にスカラ演算に徹するこ とですね。そして運用で性能を求めるのがいい でしょう。例えば、途中結果が実は毎回同じ 値であれば、計算結果を保持し、そこから条件 に応じた計算を行うとか・・・アイデア次第で す。 また、CPUはパイプ処理されているでしょうから、 パイプ処理の性能上のマイナスは条件分岐です。 条件分岐が必要なものはまとめて行い、単純繰り 返しをなるべく多く演算できるようにするのは 同じCPU100%でも、計算量が変わるでしょう。 ここでいうパイプ処理はスーパーコンピュータの 1方式のパイプとは違い、汎用機用のパイプ処理 です。

komasin829
質問者

お礼

Tasukeさん、色々教えて頂いてありがとうございます。やはり並列計算ともなると奥が深いんですね。。。 ただ説明不足だったかもしれませんが、私が今やろうとしているプログラムでは簡単に言うと、「M(値xに依存)の逆行列を求めて、行列K(定数行列なので初めに1回定義)との積を計算して、その固有値を求める」これを色々なxについてのループ(1000回以上)。 なので、自分の手で並列化すること自体が非常に簡単なプログラムと思えるのですが、どうでしょうか? くどいようで本当に申し訳ありません。。。。 Tasukeさんに限らずどなたでも教えてくださると大変助かります。

関連するQ&A

  • 大規模疎行列の高速な計算方法について

    突然の思い付きで大規模疎行列と列ベクトルの積を高速に計算する必要に迫られています。 しかし、右も左もわからない状態です(ついさっき疎行列という言葉を知りました)。 なにか取っ掛かりが欲しいのですが参考になる資料などありましたら是非教えてください。 計算する行列の特徴などを書いておきます ・約2600万×2600の万正方行列です(分割しない場合) ・対角線(左上から右下)に対して対称に分布しています ・対角線上に帯状に分布しています ・ゼロでない要素は全体の0.002%程度です(十分大きい行列の場合) さらに、GPUを使いたいとも思っています。 煮え切らない質問で申し訳ないのですがどうぞよろしくお願いします。

  • 並列処理についてですが、

    並列処理についてですが、 SCOREという並列環境を構築するソフトで、4つのPC(CPU:Quad Core)を、並列化させ、 ある逐次プログラム(C言語、ラプラス方程式を差分法で解くプログラムですがプログラム内容はあまり関係ないので、あるプログラムとさせていただきます)を並列処理させたところ、 1つのPCで、4つのプロセッサを使用し、合計4ノードで並列処理を行った場合と、・・・(1) 4つのPCで各PC1台につき1つのプロセッサずつ、合計4ノードで並列処理を行った場合では、・・・(2) 同じ4ノードであるにかかわらず、 (2)がノード数に比例的に演算性能が良くなることに対して、 (1)の場合、ノード数が増えても関数log(x)(雰囲気です)をグラフにしたような形で、演算性能がうまく良くなりません このような質問を以前したところ、 ・スレッド切り替えのオーバーヘッドが影響しているのではないか ・実行環境が違うことと、ひとつのプロセスですべてのコアを占有する thread はコアを2個使えば2倍、3個使えば3倍それぞれ速くはならない。一方、PCを組み合わせて使う場合、それは完全に独立しており、データ並列のために分割されて計算量が縮小された分、PC組み合わせ数にほぼ比例して速くなる。 という回答をいただくことができました。 なんとなくで意味は分かるのですが、何卒PC初心者なもので、あまり理解することができません。 ここからが質問です。 ・「スレッド切り替え」とは一体どういったものなんでしょうか ・いただいた回答で、「ひとつのプロセスですべてのコアを占有するスレッド」とはどういうことでしょうか このことについて教えていただきたいです。スレッドとは、など部分部分での単語は調べてみましたが、 どういったように動いているのかが分かっていないせいか、上記質問のようなことが分かりません。 回答をせっかくいただいたのに自分の語彙力のせいで度重なる質問をさせていただくことを申し訳なく思いますが、みなさん回答の方よろしくおねがいします。

  • 行列の直行、固有値、基底ベクトルなど行列演算に関するイメージ

    行列の直行、固有値、基底ベクトルなど行列演算に関するイメージ 画像処理の勉強をしており、行列演算の理解が必要となってきているのですが、いまいちイメージがつかめません。 導き方などは昔習ったので分かるのですが、その意味やどういった風に活用するのかが分からないといった常態です。 行列の直行、固有値,固有ベクトル、基底ベクトルなど、行列の基本的な計算に関して、その意味について分かりやすく説明してくれているサイトってありませんか? ベクトルで例え、図入りで説明していてくれるとすごく助かります。

  • 行列の問題です。

    行列の問題です。 (1)エルミート行列の固有値は実数であることを示せ。 (2)ユニタリー演算子を行列で表現したものはユニタリー行列になることを示せ。 (3)2つのユニタリー演算子U1とU2の積U1U2はユニタリー演算子であることを示せ。 ※(3)の1・2はUの添え字です。 回答お願いいたします。

  • 行列のランクの計算し方。

    行列のランクの計算し方についてです。固有ベクトルを計算するとき、固有値が2重解なら、ランクの計算が必要とわかってますが、どう計算すればいいか、たとえをあげて、説明してくださいませんか? また、固有値が2重解のとき、固有ベクトルはどう計算します?

  • 固有値

    次の行列の固有値と固有値に属する固有ベクトルをもとめよ。 (1)(-2) (2)(-3) といゆ問題なんですが、固有値を出すと1±√-1と言う様な複素数が出てくるのですが、 固有値に複素数ってありですか??それとも計算ミスとか、問題ミスですか?? この場合答えはなんて書けばイイですか??

  • PS3の演算能力をPCで活用する方法

    PS3の演算能力をPCで利用したいと思っています。 私はPCで演算ソフトを用いて、演算を行っています。しかし演算に時間がかかりすぎて困っています。 以前PS3を並列化させて高速演算の実行に成功したというニュースを見ました。そこでPCにPS3の演算能力を付加させたいと考えました。 ですがPCとPS3のCPUの並列接続の方法が分かりません。 そこでPCとPS3のCPUの並列接続の方法を教えてください。 PS3は分解し、最悪壊れても構いません。PCはwindowsXP(core 2 duo)とwindows7(i5)の二台がありますが、壊すことは決して出来ません。 C++言語とhtml言語はある程度理解できますが、CPUとGPUとの違いはあまり分からないような状況です。ちなみに扱っているソフトは、Matlab(行列などの計算)とPro/ENGINEER(設計ソフト)です。

  • 複素数の和、差、積、商を計算できる関数を作成し、以下のような実行結果を実現できるプログラムを作成せよ。 但し、複素数の各値は任意に指定できるものとせよ。 <実行結果> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 1 計算結果は 4.000 +j 6.000 である。 <実行結果> 複素数1の実数部を入力してください。 2.3 複素数1の虚数部を入力してください。 4.6 複素数2の実数部を入力してください。 5 複素数2の虚数部を入力してください。 13 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 2 計算結果は -2.700 +j -8.400 である。 <実行結果> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 3 計算結果は -5.000 +j 10.000 である。 <実行結果例4> 複素数1の実数部を入力してください。 1 複素数1の虚数部を入力してください。 2 複素数2の実数部を入力してください。 3 複素数2の虚数部を入力してください。 4 演算の種類を選択してください。 和(複素数1+複素数2):1 差(複素数1-複素数2):2 積(複素数1*複素数2):3 商(複素数1/複素数2):4 4 計算結果は 0.440 +j 0.080 である。

  • C言語で

    C言語で複素行列の和と積を計算するプログラムを作りたいのですが、 よくわからないので教えてほしいです。複素数を構造体で定義して、配列を使えば いいと思うのですが・・・。 ちなみに実数の行列の和と積を求めるプログラムはわかっています。

  • 行列の非対角成分

    量子力学で演算子を行列化するさいには、演算子の固有状態を用いると 行列は対角化され、対角成分はそれぞれ平均値になります。ここで状態に演算子の固有状態以外を選ぶと非対角成分があらわれます。この非対角成分の物理的な意味は何なのでしょうか。どなたか説明をお願いします。