痔になりやすい生活習慣とは?

Windows上での話という事でお願いいたします。

HTが出始めた頃の高級言語C++やDelphi等で作成した、マルチスレッドプログラムは、そのままでマルチコアに対応しているのでしょうか?

多くの記事やネット上の情報およびインテルのQuad coreのプロモーションを見る限り、プログラムがマルチスレッドならば、そのままマルチコアを有効に利用できるような事が書いてありますが、プログラミングにおいて、特別にマルチコアに対応するようなコードは必要ないのでしょうか?

C#用のQuad Core対応といったようなライブラリもあり、特別な処理が必要なのではという雰囲気がただよっているのですが・・・。
(ライブラリのソースまで見れたわけではないので、実態がよくわからない)
Quad Core対応のライブラリというのは、いったい何をしていると予想されますでしょうか。
4スレッドで動く事を前提に最適化されているだけなのでしょうか。

といった疑問なのですが、お暇がありましたら
ご回答いただければ幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

★アドバイス


>そのままでマルチコアに対応しているのでしょうか?
 ↑
 対応しているが最適に対応しているかはソフトによります。
>特別にマルチコアに対応するようなコードは必要ないのでしょうか?
 ↑
 処理によりマルチコアに見合うコードを書くことも必要でしょう。
>Quad Core対応のライブラリというのは、いったい何をしていると予想されますでしょうか。
>4スレッドで動く事を前提に最適化されているだけなのでしょうか。
 ↑
 こちらの推測ですが、最適化というよりは次の API 関数に対応したライブラリを
 用意しましたよ。という意味ではないでしょうか。
 GetProcessAffinityMask
 SetProcessAffinityMask
 GetThreadAffinityMask
 SetThreadAffinityMask
>特別にマルチコアに対応するようなコードは必要ないのでしょうか?
 ↑
 必要な場合もある。
 例えばある計算をした場合にマルチコア(4個)の場合、4つに均等に処理が割り振られます。
 しかしプロセッサが切り替わるときにいろいろなデータなどの退避、復元などが起こります。
 このプロセッサの切り替わりは OS が勝手に行いますが、1つのプロセッサにずっと処理を
 任せたい場合は SetProcessAffinityMask、または SetThreadAffinityMask を使います。
 これによりプロセッサが切り替わるときの無駄な処理を減らせる分だけ高速化します。
 これがマルチコアに最適に対応したい場合です。
・単純なマルチスレッド・プログラムでは、マルチコアでも動きますが上記のような事を
 考えていない分だけ最適化されていません。
 上記の API 関数が Windows NT4.0 以降でサポートされているため、
 Windows 95/98/Me のマルチスレッド・プログラムではマルチコアで動きますが、
 最適に対応しているかは処理によって分かりません。
 でもマルチコアを有効に利用してくれるでしょう。

参考URL:http://msdn.microsoft.com/ja-jp/library/cc429021 …
    • good
    • 0
この回答へのお礼

お忙しいところありがとうございます。
なるほど。プロセッサが切り替わる場合もあるんですね。
ライブラリにも上記のAPIはありました。
大変参考になりました。
今後どのあたりに重点を置いて調べればよいのか
明確になってきました。ありがとうございました。

お礼日時:2008/09/03 10:21

HTはそれ以前のマルチプロセッサと違って演算器を共有していたので特別なチューニングをしないと使い物にならないほど性能が劣化する場合もありましたが、マルチコアは演算器も独立だし特別なチューニングは必須ではないと思います。


ただコア間でキャッシュを共有しているならキャッシュに気を使わないと性能が劣化しますし、4CPUともなるとバス競合が大きくなってくるのでチューニングするならバス利用率も考慮する必要がありますね。
Quad Core対応ライブラリが具体的に何をしているかは分かりませんが、チューニングするなら上記のような点を考慮することになるでしょう。
    • good
    • 0
この回答へのお礼

お忙しいところありがとうございます。
そういえば、キャッシュに関しては何かの記事で読んだ事があります。
なるほど。
聞いてみるといいものですね。
大変参考になりました。

お礼日時:2008/09/03 10:15

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

QDelphiのマルチスレッドの割り込み処理について

Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;

Aベストアンサー

実際にプログラムを作って試した訳ではありません。見当違いでしたらすみません。

BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。

ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。

例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。

また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。

QマルチコアCPUに最適化したアプリの開発

Core2などのマルチコアCPU(MPU)の性能を最大限に活用するアプリを開発するには、特別な手法あるいは開発環境が必要なのでしょうか?
現在、VisualStudio6で開発を行っているのですが、同じexeをPentium4とCore2で実行しても、処理スピードにあまり違いが感じられません。

あるいは、CPUへの割り振りはOS(Windows)が行うので、アプリ開発の際は気にする必要はないのでしょうか?

よろしくお願いします。

Aベストアンサー

>CPUへの割り振りはOS(Windows)が行うので、
>アプリ開発の際は気にする必要はないのでしょうか

普通はそうなります。
こんな部分の制御までプログラマが気にしていては生産性が上がりません。

>特別な手法あるいは開発環境が必要なのでしょうか

当然あります。といってもOSは究極にいえば自作になりますが・・・
OSの担当する部分を自分達でコードして、
その分のオーバーヘッドをカットすれば、かなり高速になります。

また、ソフトの部分をハードに置き換えればかなり高速になります。
グラフィックボードにみられるように、ファームウェアで組むこともありましょう。
このような開発言語はアセンブラをおいて他にないでしょう。

結局、特殊用途というのは相手の構成を決め打ちして強制させる部分もあります。
そうした前提があってプログラムも有効になります。

VBみたいな汎用の言語を使って汎用のOSに依存する形だと限定的にならざるを得ません。
それでも言語の方で最新のアーキテクチャをサポートしているかどうかは大切ですから、
こういった方面を重視するのであれば言語のバージョンもなるべく最新のものを用意します。
こういった観点からするとVB6は時代遅れという感は否めません。

>CPUへの割り振りはOS(Windows)が行うので、
>アプリ開発の際は気にする必要はないのでしょうか

普通はそうなります。
こんな部分の制御までプログラマが気にしていては生産性が上がりません。

>特別な手法あるいは開発環境が必要なのでしょうか

当然あります。といってもOSは究極にいえば自作になりますが・・・
OSの担当する部分を自分達でコードして、
その分のオーバーヘッドをカットすれば、かなり高速になります。

また、ソフトの部分をハードに置き換えればかなり高速になります。
グ...続きを読む

QマルチコアCPUはコア数が多ければ多い程有利なのではないのですか?

最近マルチコアのCPUをよく見かけます、

それで、例えば、Core2DuoとCore2Quadを比べた質問、についてですが、
この手の質問では、Quadはマルチスレッド対応アプリを使わなければ
Duoと大きな違い感じられないという回答がよく見られます。
又、むしろ消費電力が大きくなり2コアに比べクロック数も低いので
対応アプリを使わなければ逆に4コアは不利であるという意見もあります。

しかしどうも疑問を感じます。
上記の内容はあくまで一つのアプリを動作させた場合の事を想定した物なのでは?
ごく日常での使用ではコア数が多い方が有利なのではないですか?

私の考えとしては、まずPCを扱う際一つのアプリのみを起動しPCを使用する人はまずいないという事から、
使用中に他のアプリや別のプログラムを実行するという場合も大いに考えられますし、
実際にタスクマネージャなどを見てもOSを起動起動するだけでかなりのプロセスが実行されいくらかCPUを食っています。
するとその様なマルチコア向けのアプリケーションを使用せずとも多数のシングルスレッドのプロセス実行と共に
複数のスレッドが発生し、結果例え速度的な変化は感じられずともマルチコアの恩恵を受ける事が出来るのではないか?
と、私は思うのですがこれは間違いなのでしょうか。

それとも実際は上記の内容は間違いでそう都合良くは出来ていない物なのでしょうか?

長くなってしまいましたが回答いただけると幸いです、よろしくお願いします。

最近マルチコアのCPUをよく見かけます、

それで、例えば、Core2DuoとCore2Quadを比べた質問、についてですが、
この手の質問では、Quadはマルチスレッド対応アプリを使わなければ
Duoと大きな違い感じられないという回答がよく見られます。
又、むしろ消費電力が大きくなり2コアに比べクロック数も低いので
対応アプリを使わなければ逆に4コアは不利であるという意見もあります。

しかしどうも疑問を感じます。
上記の内容はあくまで一つのアプリを動作させた場合の事を想定した物なのでは?
ごく日常...続きを読む

Aベストアンサー

マルチコアがどれくらい有効なのかは、ユーザーの使用の仕方で大きく変わってきます。
具体的な「使用中に他のアプリや別のプログラムを実行する」の頻度次第ですね。
しかも、単に複数のシングルスレッドアプリを立ち上げるだけでは、マルチコアの意味はありません。

まず、通常の利用方法である、同時に1アプリしか使っていない状況でも、
デュアルコアの意味はあります。「OS」と「使用しているアプリケーション」の2スレッド。でも、この場合は3コア以上あっても意味無し。
あるアプリの使用中に他のアプリを立ち上げても、その両方を同時に使うのでなく、切り替えて使う場合は、使ってない方のアプリはCPU時間を消費しません。

ここで「常時稼働してCPU時間を消費する」ようなアプリを裏で稼働させるような作業をして、初めて3コア目が役に立ちます。
たとえば、「通常の作業をしながら、裏でウィルス対策ソフトによるスキャンをする」とかですね。この場合、ウィルス対策ソフトは常時稼働していますから、ユーザーが操作しているアプリとOSと併せて3コア分は意味があります。

そんな感じで、日常的に「単に起動しているだけではなく、稼働してCPU時間を多大に消費している」ようなアプリをコア数に匹敵するだけの多数動かしているのであれば、「コア数が多い方が有利」といえるでしょう。
そうでなければ、コアが多くても無駄なだけです。

具体的には、タスクマネージャでプロセスタブを選んで、「CPU」をクリックしてCPU使用率の順で並べたときに、
「CPU使用率の高いプロセス」がどれだけあるかで判断できるでしょう。
CPUを使ってるプロセスが1つしかないとか、System Idle Process が一番高いとかだったら、マルチコアの恩恵はほとんどありません。
「30%ぐらいのプロセスが3つある」とかいった状況だったらクアッドコアの意味が出てくるでしょう。

マルチコアがどれくらい有効なのかは、ユーザーの使用の仕方で大きく変わってきます。
具体的な「使用中に他のアプリや別のプログラムを実行する」の頻度次第ですね。
しかも、単に複数のシングルスレッドアプリを立ち上げるだけでは、マルチコアの意味はありません。

まず、通常の利用方法である、同時に1アプリしか使っていない状況でも、
デュアルコアの意味はあります。「OS」と「使用しているアプリケーション」の2スレッド。でも、この場合は3コア以上あっても意味無し。
あるアプリの使用中に他のア...続きを読む

QC++ 構造体の一括初期化 {0}

構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。
なんでこんなことが出来るのでしょう?
{0}は何?
仕組みを教えて下さい!!

Aベストアンサー

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
>(再帰的に)適用し初期化する。

なので、zero初期化されていることが、規格で保証されます。

typedef struct hoge_struct
{
 int a;
 int b;
} hoge_struct;

static hoge_struct initializer; //初期化用変数。値は変えない。

int main(void)
{
 hoge_struct hoge;
 hoge = initializer;
 return 0;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。

> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用...続きを読む


人気Q&Aランキング