- ベストアンサー
マルチスレッド分散処理関係
現在、ウィンドウズマシンで認識するCPUコアの数は何個なんでしょう?アフィニティマスクの事を考えるなら32個という事になるんでしょうか?64ビットOSの場合は64個ですか?Vistaの場合はその辺はどの程度拡張されているんでしょう?128コアとかが使えるようなメニーコアの時代はまだまだ先なんでしょうか。誰か詳しい方ご教授お願いいたします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>サーバー・スパコン等は利用状況から考えて、そういったパフォー >マンスの劣化を生じない様なハードウェア設計になっているという >事はないのですか?現存の汎用PCのハード構成にあてはまるもので >すか? 私の専門はゲーム(コンソール、PC)なので サーバーやスパコンについては良く知りません。オンラインゲーム等で サーバー側の情報が必要になることもあるので、 つまむ程度に知っているぐらいです。 PCに関して言えば同じデュアルコアのCPUであっても各コアがL2キャッシュを共有するものとしないものがあり、 コードの最適化の方法が変わってきます。(更にAMDはL3キャッシュ的なものを作ろうとしているようです。) よくCPUメーカーが自社のベンチマークソフトで他社のCPUと比較していますが 勝って当然なのです。 例えばPS3と360に関して、両方ともマルチコアですが、 マルチスレッドにおける最適化を考えると全く別コードが出来上がります。 ※PS3や360の内部機構については公式ホームページにでてるもの参照してください。 つまりパフォーマンスを最大限に引き出すといっても まずハードに依存し 次にOS(or SDK)によって制限され その次にそれらに合ったプログラムによってパフォーマンスが決まります。 昔NHKでスパコンの特集をしていましたが、(タイトルは忘れました) 分子結合等のシミュレーション計算の並列処理を 基本的にアセンブラレベルで最適化しているといった話を聞いたことがあります。 >クリティカルセクションの方が計算負荷がましなんだとか。自分 >もmutexは使いません。 ちなみにWindows(x86系CPU)で一番高速といわれているのは MutexでもCriticalSectionでもなくInterLock系のAPIで独自にロック機構を作る事です。(最初に上げたURLのカプコンのMTフレームワークの開発話の中でその話がでています。) ただしシングルコアにおいては CriticalSectionの方が速い場合もあります。 (デュアルコアにチューニングしないのであればCriticalSectionが無難)
その他の回答 (8)
- don_go
- ベストアンサー率31% (336/1059)
http://www-06.ibm.com/systems/jp/x/scalable/3755/index.shtml IBM System x3755 上記はANo.3で紹介したサーバー機の下位機種ですが 「ビジュアル・ツアーを見る」 で内部の様子を見る事ができます。 この機種では画面の左下にあるプロセッサーカードにより CPUの個数を変更できる様になっていて、且つ各カード毎に メモリスロットを標準装備するという構成になっています。
- sha-girl
- ベストアンサー率52% (430/816)
>表記の内容は共有するメモリの同期の事ではなく、プロセス間の仮想 >メモリ空間の話なのでしょうか? 一般的(WindowsやLinux)ではプロセス毎にOSから仮想メモリ空間が割り振られます。 つまり他のプロセスのメモリへアクセスする事は基本的に出来ません。 一方マルチスレッドは1プロセス(同じメモリ空間)の中で複数スレッドが 起動するわけで、コーディングレベルで同期処理等が必要になります。またそれとは別に 前述の通り同じアドレスに同時に書き込もうとするとメモリロックがかかり どちらかのコアが待たされます。(CPU依存) >つまり、マルチスレッドよりマルチプロセスの方が並列効果が得やすい訳ですね。 そうです。100CPUもっているマシンは あるアプリを100個のプロセスとして同時に起動したのと 1個のプロセスのみで起動したのと比較して 1プロセスあたりのパフォーマンスの差はほとんどないはずです。 (マルチプロセスであっても共有メモリやセマフォを多用すればマルチスレッドと同じように 速度向上の足を引っ張りあいます。) >1プロセス×Nのパフォーマンスを期待できるのでしょうか? 近い値を期待してよいと思います。 ただプロセスやスレッドはOSが管理するものですから その管理に対する多少の減損は考えられます。 また上記に書いてるようにセマフォ等を使えば、当然そのパフォーマンスは 期待できなくなります。 ちなみにマルチスレッドを使ったJavaアプリを 1CPU→4CPUにかえて1.2倍ほどの速度しか得られなかったという事例があります。 (このアプリはSynchronizedやmutex等を使いまくっていました。)
お礼
>1.2倍ほどの速度 並列化し易い案件かそうでないかという事もあるかと思いますが、 確かに、mutexは極力使わないようにというのはよく聞きますね。 クリティカルセクションの方が計算負荷がましなんだとか。自分 もmutexは使いません。 >あるアプリを100個のプロセスとして同時に起動したのと >1個のプロセスのみで起動したのと比較して >1プロセスあたりのパフォーマンスの差はほとんどないはずです。 サーバー・スパコン等は利用状況から考えて、そういったパフォー マンスの劣化を生じない様なハードウェア設計になっているという 事はないのですか?現存の汎用PCのハード構成にあてはまるもので すか?
- sha-girl
- ベストアンサー率52% (430/816)
>今のハードウェアの構成では何コア位までが有効に並列 >効果が得られる限界なのでしょう? 結局アプリケーションの実装によります。 これもゲームの話で恐縮ですが興味深い記事として コア数とパフォーマンスのグラフがでています。(グラフ2) http://www.4gamer.net/games/030/G003078/20070625144243/ 4コアを超えたあたりでほとんどパフォーマンスの上がりにくくなっています。(このゲームは前述したMTフレームワークを使っています。) 一般的に 2つのコアが同じメモリに書き込もうとすると、優先順位の低いコアが1クロック待たされることになります。 つまり、マルチコアによるパフォーマンスを高めようとすると、いかに メモリ空間をコア毎にわけるかが重要になります。 例えばゲームの場合、フィールドを何個かの区域にわけて物理演算を行う方法がありますが 少なくとも、フィールドの境界ではメモリの同期が必要になります。 フィールドを多く分ければ(コア数が多くなれば)当然境界の数が増えてくる為 パフォーマンスが上がりにくくなります。 PC用途の話でなければ 例えばWEBサーバーではコネクション毎にプロセス(or メモリが独立しているスレッド)を立ち上げれば いいわけで そういう場面で並列処理の効果があります。
補足
またも面白いサイトのご紹介有難う御座います。 表記の内容は共有するメモリの同期の事ではなく、プロセス間の仮想 メモリ空間の話なのでしょうか?つまり、マルチスレッドよりマルチ プロセスの方が並列効果が得やすい訳ですね。 下の回答者の方の意見から、たとえ同期を必要としない自律動作する ごく単純なアプリであってもコアの数の分だけ速度をかせげるわけで はないと言っている様に感じたもので・・・。バスのお話はそういう 話だと受け取っていました・・・。 独立した仮想メモリ空間にある変数のみを操作する、他のプロセス非 依存のプロセスをコアの数だけ走らせたとして、1プロセス×Nの パフォーマンスを期待できるのでしょうか? この場合でも、ある所で頭打ちになるのかと思いショックだったんで すが・・・。マルチコアマシン持ってないので試しよう無くて・・・。
- don_go
- ベストアンサー率31% (336/1059)
>サーバってそんなにメモリを消費するものなんですか? サーバーにも種類が多数あり、この手の物は大量のデータを 大容量のメモリとCPUパワーで処理を行う様な処理。 例えばデータベースサーバーの様な用途むけと言えます。 >市場の動向がそうなら仕方ないんですが、個人的にはメニーコアは >魅力に感じるんですが・・・ 1車線の道路に1つの料金所を作るより、2~3個所作った方が 渋滞を防ぐのに効果的だからといって、料金所を20作ったら もっと効果的になるかというと、今度は料金所を過ぎた所で 渋滞を起こすのと同じで、1組のメモリアドレスバスを介して 同じメモリ空間を多数のCPUで共有して使う事は却って効果が 無くなります。 マザーボードにしてもCPUを2個マザーボード上に実装した物は 有りますが、3個以上の場合はマザーボード及びPCの構成自体を 根本的に変える必要が有り、大容量のメモリと多数のCPUの電源 を確保する為にも電源等も強化する必要があります。 こういった構成が全く異なる高性能PCの要求が高ければ量産効果 により値段も安くなるのでしょうが、軽自動車や原付で満足して いる人に高級乗用車や高性能スポーツカーを売る事は、必要性が 薄い事と値段の事もあって購買者層が限られるので大量に売る事 が難しくなるのと同様なので、量産が難しい上に他メーカー(Mac 他)や他OS(Linux等)との競争もあるので、安価な価格帯での販売 の実現は当分難しいと思います。
補足
>1組のメモリアドレスバスを介して同じメモリ空間を多数のCPUで >共有して使う事は却って効果が無くなります。 なるほど・・・少しショックですが、並列効果では帰納的に飛躍的 な高速化という訳にはいかないという事でしょうか・・・。 ちなみに、今のハードウェアの構成では何コア位までが有効に並列 効果が得られる限界なのでしょう?また、トレードオフに見合った 効果が得られると考えられるコアの数はどれ位だとおもいますか? 単純な興味だけなんですが・・・お詳しい方の様ですので、できれ ばご回答宜しくお願い致します。(バスのクロックがどれ位だった として・・・という感じで答えて頂けると有難いです。)
- sha-girl
- ベストアンサー率52% (430/816)
>VistaでのPlatform SDKの追加・拡張に関する情報やOS毎の対応状況等 >は何を調べるとわかりやすいでしょうか?この辺で、時代についてい >けずに困っています・・・。 私もそれほど詳しくはありません。 基本的にはmsdnの英語版サイトの情報が最新だ、、と信じている程度です。 (日本語版の更新が遅い、あるいはされない事は確かです。) http://msdn2.microsoft.com/en-us/default.aspx ちなみに昔のドキュメントでは SetThreadAffinityの引数は DWORD(32bit固定)でしたがいつの間にかDWORD_PTR(依存) に変わっていました。これはVistaでの新機能ではありません。 xpも普及こそしませんでしたが64bit版が存在しますしWindows Serverファミリは更に早くから64bitに対応しています。 勿論OSが64bitであっても、64bitでコンパイルされたexe(dll)でなければ 当然32bitモードで動作します。 Vistaの新機能、及びxpとの違いに関しては 全てを網羅することは不可能に近いと思います。 欲しい情報だけピックアップするのが現実的です。 http://msdn2.microsoft.com/en-us/windowsvista/default.aspx ※具体的なwindowsの技術的問題はmsdnフォーラムを利用すれば私なんかよりはるかに詳しい方が 答えてくれるでしょう。
補足
msdnフォーラム素晴しいです。 貴重なアドバイス有難うございました。 非常に助かります。今後、有効に活用しようと思います。 ここまで長らくお付き合い頂き、真に有難うございました。
- don_go
- ベストアンサー率31% (336/1059)
最近(1月31日)IBMから最大64コアまで対応のx86サーバーが 発売されたようです。 http://www-06.ibm.com/systems/jp/x/scalable/3950m2/index.shtml IBM System x3950 M2 メモリが4GB~1TB(1024GB)、対応OSはRedHat Linux Enterprise 、SuSe Linux及びWindows Server版(Vistaとは1桁価格が違う Server版の立場がなくなる(?)のでVistaは未サポート) x86サーバーはこの手の物としては低価格帯の機種に入りますが さすがに最大構成では400万円を越し低価格なUNIXサーバーをも 凌駕します。 #OSをWindowsに限定しなければ、1980年代には既に128程度のSMP #構成は実現している様です。 あくまでもVistaは初心者を含む一般ユーザーがデスクトップでの 使用が前提のOSの為32ビット版が32個64ビット版が64個までのCPU 対応がAPI的には用意されてはいますが、初心者の利用も多いVista でアフィニティマスクを用いて数十個のCPUの割り当てを行う事は トラブル続出するのが容易に予想できますし、デスクトップ目的で 30個・40個と搭載してもほとんどのCPUコアが仕事もなく電気を無駄 に消費するのみとなってしまうので、例え64ビット版のVistaでも 数十個のCPUを使用した環境で動作するハードウエアは、価格的にも 使用目的からしても提供される可能性は極めて低いと思います。
補足
面白い記事を紹介して頂き有難うございます。 1TBメモリーって凄いですね・・・。ハードディスクじゃなかろうに、 サーバってそんなにメモリを消費するものなんですか? >提供される可能性は極めて低いと思います 残念です・・・。 アフィニティマスクに関して、自分が使うとしたら数あるコアの中で利 用してよいCPUの範囲を限定するといった使い方(CPU9~16は絶対 使わないとか)でしょうか、一つのCPUコアにスレッドを貼り付ける 様な使い方は自分はあまりしません。 ただ、たとえば動画像とかの膨大なデータを扱う処理の重いソフトを 一生懸命マルチスレッドにしたとして、マシンがデュアルコアで処理 速度が1.5倍になりました、動作時間が1時間から40分になりましたって いってもなんか釈然としなくないですか? 市場の動向がそうなら仕方ないんですが、個人的にはメニーコアは 魅力に感じるんですが・・・そうは思いませんか?
- sha-girl
- ベストアンサー率52% (430/816)
>128コアとかが使えるようなメニーコアの時代はまだまだ先なんでしょうか。 コア数を増やせば、その分1CPUあたりの消費電力、発熱量、価格が上がってしまいます。 今のところ個人向けは8コアが最大ですが 個人レベルで8コアが普及するのはは相当先、 或いはコア数が今後も増えていくかどうかもわかりません。 現在CPUの方向性としては発熱量を抑え、昔のようにクロック数を上げる方向に進んでいるように見えます。 (サーバー用途でもない限り個人で8コアの恩恵はほとんどありません。 いくら分散処理をしても同期を取る場面が多くなれば、ほとんど速度は変わらなくなります。 一般的に1プロセスにおいてコア数が増えれば増えるほど、1コアあたりの損失率は高くなります。 わかりやすくいうと2コアなら速度1コアに対する速度が190%アップ 4コアなら300% 8コアなら400%といった感じです。 もちろんプログラムをマルチスレッドに最適化する事は前提です。) 参考までにカプコンのMTフレームワークに関する記事です。 http://www.4gamer.net/specials/capcom_x_intel/capcom_x_intel_01.shtml >アフィニティマスクの事を考えるなら32個という事になるんでしょうか? WindowsAPIで論理CPUを明示的に割り振る場合 SetThreadAffinityMask及びSetProcessAffinityMaskが用意されていますが 最新のドキュメントによれば DWORD_PTR WINAPI SetThreadAffinityMask( HANDLE hThread, DWORD_PTR dwThreadAffinityMask ); となっており64bitOSでは64個まで論理CPUを指定できるようになっております。(DWORD_PTRは32bitOSでは32bit、64bitOSでは64bit) ただしこれはWindowsの仕様であってOSのbit数=コア数ではありません。 (現にSolaris64bit版で100個以上のCPUを制御しているものがあります。確か値段は4億ほどしたと思います。) ちなみにWindows Server 2003 DataCenter Editionも最大64個の物理CPUまでしか認識しなかったと思います。 2008については分かりません。 http://www.microsoft.com/japan/windowsserver2008/default.mspx ※若干私の持っている情報は古いかもしれません。
補足
丁寧で素晴らしいご回答どうも有り難う御座いました。 参考になります。MTフレームワークの記事なんか非常に面白かったです。 非常にお詳しい方のようなので、更に追加で質問してもよろしいでしょうか? VistaでのPlatform SDKの追加・拡張に関する情報やOS毎の対応状況等 は何を調べるとわかりやすいでしょうか?この辺で、時代についてい けずに困っています・・・。
- don_go
- ベストアンサー率31% (336/1059)
http://oshiete1.goo.ne.jp/qa2978156.html Windows Vista の各エディションのCPU認識する数は? >64ビットOSの場合は64個ですか? CPUのビット数とコアの数は全く関係ありません。 >メニーコアの時代はまだまだ先なんでしょうか。 商用UNIX機や汎用機並に数十個以上のCPUを使用する構成のPCは 一般ユーザー(企業ユーザーにとっても)の用途としては過剰に すぎる機能及び価格になるのでまだまだ先・・というか家電量販 店で販売される様になる事はまず考えられないと思います。
お礼
丁寧なご回答ありがとうございます。マルチCPUに関しての制約は意外に厳しい事を知り参考になりました。 ただ、質問内容が不足していたので補足します。 自分が言いたいのは1CPU内のコア数の事です。最近クアッドコアの商用機も出回る様になり、嘘か真かオクタコア(8個のCPUコア内臓)の開発自体も始まってるんだとか・・・。オクタコアにハイパースレッディングが付くとPC上では16コアに見えるんだとか・・・市場に出るのはいつになるのかはいたって謎ですが・・・。 Windows系の開発をやった人なら、多くの人がプロセス、スレッドに対して各処理をどのCPUコアを使って行わせるか(禁止させるか)指定できる事を耳にした事があると思います。で、その指定マスクが32ビット環境(2000、XP等の32bitOS)では、その指定上限が32個(だったか?)だったと思います(それが上記のマスク)。だから、OSが認識するCPUコアの数として32位かと思ったんですが・・・他の理由でもっと少なかったりするんでしょうか??? で上の話のオクタコアCPUとかの話に戻って、今後、倍々とCPUコアの数が増えていく事があったとしたら、OSが認識出来る最大CPUコアの数にぶつかる事もありそうに感じて、その対応としてVistaパソコンとかではどう変わったんだろうといった疑問でした。 実際、その頃にはOS自体もまた新しく変わってたりしそうなんですが・・・。 更なるご回答を頂けると有難いです。宜しくお願い致します。
お礼
残念・・・閉めます。 回答者の皆様、どうも有り難う御座いました。
補足
まだ見てくれてますか? >InterLock系のAPIで独自にロック機構を作る 恥ずかしながら初耳でした。どういうことなんでしょう? 詳細な情報を頂けると有難いです。 自分が主に使うのはBoland C++とVisual C++ですが いずれかの環境で簡単に実装できるものですか?