プロが教える店舗&オフィスのセキュリティ対策術

表題の通り、マルチコアCPUを仮想的にシングルコアに統合して扱える様にするソフトウェアを探しています。
有料ソフトでもご存知であれば情報を教えてください。

求める要件
1.統合した単一コアは、CPU本来の単一コア性能の1.5倍以上であること
→例えば2.6GHz*4のCPUから2コアを統合した場合は、4GHz以上の性能を持つ単一コアになる。

2.統合した単一コアに向ける処理の順序が狂わないこと。
→例えばABCDという命令を順番に発行したとして、その結果がACBDの様にならないこと。

理屈的に難しい事は知っておりますが、もし存在していれば教えてください。

A 回答 (4件)

バイナリしか無いのでしたら皆さんが書かれているように、多分存在しないと思います。


実行前にバイナリを並列化できるように自動的に書き直してということでしたら、原理的にはできそうに思いますが、実用的かどうかは疑問があります。

CやFortranのソースコードがあれば、多くの市販コンパイラに備わっている自動並列化機能をつかえば、そこそこの速さにはなってくれます。また、OpenMP対応のライブラリに変えれば速くはなってくれます。これらの機能には、私も結構お世話になっています。ループを多用してる数値計算などのプログラムではプログラムを書き換えることなくそこそこの効果があります。

2についてですが、
どのレベルで順番を入れ替えないというこということでしょうか。
仮にマシン語レベルだとしますと、CPUが読み込むのはその通りですが実行は読み込んだ通りにやっているとは限りません。基本的には正しい結果が得られる範囲で、速度が速くなるようにハードウエアで実行順を入れ替えています。
コンパイラでも同じように命令の入れ替えをおこなうことがよく有ります。いずれにしても、内部的に入れ替えているだけで、外から見える入出力などは入れ替えることはありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

情報不足で申し訳ないです。バリナリしかない物を対象にしています。
(ソースがあるものは自分で書き直せば良いので)

2については、誤解しそうな書き方ですみませんでした。
ACBDの例は「先の処理に依存する計算の処理結果が変わらないこと」を表現したかったものです。

私自身も開発者なので、コンパイラの命令最適化辺りまでのことは存じています。
今考えると、この質問は「最適化なし&シングルスレッドのPEを元にして、内部命令を最適化&マルチスレッド化させ、実行速度をあげる方法」の回答でも満たせたのですが、そうなると意味合いが変わってきてしまうので一旦閉じさせて頂きます。

お礼日時:2013/08/14 08:36

技術的に不可能だと思います。

そもそも、そうゆうことができるのであればマルチコアにする必要はなかった。

なぜマルチコアが主流になったかといえば、CPUの発熱や消費電力などが原因で動作周波数が頭打ちになったり、4GHz以上にしたらかえってリアクタンスの遅延が無視できなくなって非効率になったり、回路の限界がきたからなどなど。だからこそ、解決策としてマルチコアが発展してきたのであって、対称型マルチプロセッシングとかの技術も登場したのです。

そもそも、現行のCPUコアはそれぞれが独立して互いに影響を与えないよう設計されています。キャッシュも、それぞれのコアに独立してキャッシュメモリがあります。だからこそ並列計算ができるのです。

それをあえて無視して、かつ計算結果の順序も狂わないようにとなると2次キャッシュ→1次キャッシュ→CPUコア1と処理した後、また戻ってコア2のキャッシュから入らないといけなくなります。これではシングルコアと同じです。データの移動による遅延や発熱、消費電力等も含めればシングルコアよりひどい状況になるかもしれません。それぞれのコアが単体で動くので動作周波数が倍々になるなんてこともありません。

OS側もそんな機能サポートしてないですから、作るならプログラマーがOSの機能を無視してすべて独自のソフトウェアを作る必要がありますが、メリットよりデメリットの方が圧倒的に多いことへ労力は割きたくないでしょう。

PS3ではヘテロジニアスマルチコアのCellプロセッサが搭載されています。ホモジニアスマルチコアの欠点の1つであるシングルコア性能の低下問題は今後改善されていくかもしれませんが、それまではマルチコア非対応のソフトウェアをフル活用したいのならソングルコアのPCを購入した方がいいでしょう。ただ、そうなると複数のスレッドを動かすとき処理が重くなっていきますが。

参考までに。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

はい、オリジナルの命令群を単純に割り当てるとそう(非効率に)なると思います。
干渉しない命令を分割し、処理の再スケジューリングを行って、
結果、実行速度が高まる夢のようなソフトがもしあればなぁと思った次第です。

既に過去の遺産とはいえ、
マルチコア非対応のソフトウェアはまだまだ存在(新規開発、保守も含めて)しており、
それに対応するソフトウェアがもしかしたら出てきているかも、という思いがありました。

シングルコアCPUは大分型落ちしてしまっているので、現在でしたら4.2GHz*4など、
単一コアが高クロックのマルチコアCPUを購入して対応するのが現実的かもしれませんね。

お礼日時:2013/08/14 07:39

少なくとも現時点では不可能だと思います。



それが実現するって事は、「アプリがマルチスレッドプログラミングしてなくてもマルチコア対応」って事ですけど、現時点のOSでその機能を持ち合わせているものはありません。そこまでディスパッチャはかしこくないです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>> それが実現するって事は、「アプリがマルチスレッドプログラミングしてなくてもマルチコア対応」って事ですけど

そうなりますね。

例えばになりますが、returnがなく互いにメモリ内容に干渉し合わない関数の命令であれば、もしかして分割できたりしないかなーと軽く考えておりますが、それ以外に関してはまったく想定ができないです。

お礼日時:2013/08/14 07:13

理屈的に難しいのではなく


理屈的に不可能なんではないかと思います。

直前の演算の出力を次の演算の入力とする場合は同時には演算できないので、
そういった命令が延々と続くケースでは、結局のところ1コア以上の速さでは
動けないんではないかと思います。

いつでも必ず1.5倍以上ということではなく、
特定のデモプログラムで1.5倍以上、ということであれば、要件2.しだいでは
不可能ではない、のかもしれませんが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

素人考えですが、やはり最低でもスレッドが分かれてない限りは無理そうな感じはしますね。

お礼日時:2013/08/14 07:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!