2010/8/22:本掲示板は閲覧専用です。データが一部破損しておりますがご了承ください。
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
40 / 376 ツリー ←次へ | 前へ→

【1784】SetThreadAffinityMask() の実装について Mc.N 05/9/17(土) 16:21
【1785】Re:SetThreadAffinityMask() の実装について oT 05/9/18(日) 14:36
【1786】Re:SetThreadAffinityMask() の実装について ひよひよ 05/9/18(日) 16:32
【1788】Re:SetThreadAffinityMask() の実装について ひよひよ 05/9/19(月) 8:45
【1791】Re:SetThreadAffinityMask() の実装について Mc.N 05/9/19(月) 13:29
【2194】Re:SetThreadAffinityMask() の実装について ひよひよ 07/7/27(金) 0:12
【2195】Re:SetThreadAffinityMask() の実装について ひよひよ 07/7/27(金) 0:16

【1784】SetThreadAffinityMask() の実装について
←back ↑menu ↑top forward→
 Mc.N  - 05/9/17(土) 16:21 -

引用なし
パスワード
   Mc.N と申します。
CrystalCPUID の Source を眺めていたのですが SetThreadAffinityMask() の実装について気になったので教えてください。

1. SetThreadAffinityMask() の mask フラグについて
SetThreadAffinityMask() の第2パラメータはビットフラグで扱うのではないかと思うのですが、所々、数値で表されているように見えます(cpuinfo.cpp の実装辺り)。2 processor の場合、問題は無いと思うのですが、4 processor 以上の場合、意味合いが異なる気がします。

2. SetProcessAffinityMask()/GetProcessAffinityMask() を使用しない理由について
CrystalCPUID の意味合いからしてみて SetThreadAffinityMask() よりは SetProcessAffinityMask() の方が用途としては向いているのではないかと考えています。特にGetProcessAffinityMask() と対に使用できる面ではお得感がありますし。
何か理由があって SetProcessAffinityMask() を使用していないのであれば理由を教えていただけないでしょうか。

【1785】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 oT  - 05/9/18(日) 14:36 -

引用なし
パスワード
   >1. SetThreadAffinityMask() の mask フラグについて
>SetThreadAffinityMask() の第2パラメータはビットフラグで扱うのではないかと思うのですが、所々、数値で表されているように見えます(cpuinfo.cpp の実装辺り)。2 processor の場合、問題は無いと思うのですが、4 processor 以上の場合、意味合いが異なる気がします。

 for( i = 1; i <= Number; i++ ){
#ifdef _WIN32
 DWORD mask;
 if( IsNT() ){
 mask = (DWORD)SetThreadAffinityMask(GetCurrentThread(),i);
 if( i >= 2 ){
   Sleep(DualWaitTime);
 }
#endif
上の部分ですよね。
 mask = (DWORD)SetThreadAffinityMask(GetCurrentThread(),1<<(i-1));
が、正解ではないかと思います。
結果論ですが2プロセッサまでは結果同一、それに加えて
3プロセッサ以上で使用している人が殆どいなかった事が、そのまま残った理由かと思います。(どっかで見たコードも同じだった記憶があります。)

>2. SetProcessAffinityMask()/GetProcessAffinityMask() を使用しない理由について
>何か理由があって SetProcessAffinityMask() を使用していないのであれば理由を教えていただけないでしょうか。

特定プロセッサ・リソース(TSC/MSR etc)の取得/変更が主目的と思われますので、どちらを
使っても大差無いと思いますが...
逆にSetProcessAffinityMask()/GetProcessAffinityMask()を使った場合の利点はなんでしょうか?
瞬間的なプロセッサの変更が主目的の場合、ProcessよりもSetThread変更程度に留めて
おいた方がオーバーヘッドが小さいような気がしますが どうでしょう?
ソフトの性格上”マルチプロセッサでのパフォーマンスを追求”と言った事が趣旨ではない
と思われますので、結局の処 どちらでも変わりないと思います。

---
後は、作者の方のお考えを伺いましょう。

【1786】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 ひよひよ  - 05/9/18(日) 16:32 -

引用なし
パスワード
   返事が遅くなりました。すいません。

> mask = (DWORD)SetThreadAffinityMask(GetCurrentThread(),1<<(i-1));
>が、正解ではないかと思います。
おっしゃるとおりです。
ソースを読み返して、どうしてこうなってるんだろ???
と自分でも思ったわけです。次回修正しておきます。
ビットマスクであることは理解していたのですが・・・。
CrystalMark の方はちゃんとなっていますし。

>>2. SetProcessAffinityMask()/GetProcessAffinityMask() を使用しない理由について
>>何か理由があって SetProcessAffinityMask() を使用していないのであれば理由を教えていただけないでしょうか。

>特定プロセッサ・リソース(TSC/MSR etc)の取得/変更が主目的と思われますので、どちらを
>使っても大差無いと思いますが...
そうですね。スレッドレベルで、同じプロセッサで実行されていれば十分なのでSetThreadAffinityMask() を使っています。SetProcessAffinityMask()と比較したオーバーヘッドについてはわかりませんが、必要な部分のみ制限するのがマルチスレッドプログラミングの基本だと思っていたのでそうしています。まぁ、間違っていた私が言っても説得力ありませんが。

ご報告&フォローありがとうございました。

なんにせよ次回更新時に修正させていただきます。
※最近宿題がたまってるなぁ〜二週間以上更新していないのは久しぶりです。。。

【1788】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 ひよひよ  - 05/9/19(月) 8:45 -

引用なし
パスワード
   最新版で当該不具合を修正させていただきました。

【1791】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 Mc.N  - 05/9/19(月) 13:29 -

引用なし
パスワード
   Mc.N です。

>>2. SetProcessAffinityMask()/GetProcessAffinityMask() を使用しない理由について
>>何か理由があって SetProcessAffinityMask() を使用していないのであれば理由を教えていただけないでしょうか。
>
>特定プロセッサ・リソース(TSC/MSR etc)の取得/変更が主目的と思われますので、どちらを
>使っても大差無いと思いますが...
>逆にSetProcessAffinityMask()/GetProcessAffinityMask()を使った場合の利点はなんでしょうか?

GetProcessAffinityMask() で今使用しているプロセッサを確認できるのが利点です。Get''Thread''AffinityMask()なる関数が存在しているなら特に疑問視しなかったのですが、どうもそのような関数は存在しないようです。

今の所、順序良く dwThreadAffinityMask の mask が並んでいるっぽいですが、今後も mask が順序良く並んでくれるという保証はないと感じています。多分、Hotplug 出来るような CPU を想定してのことだとは思うのですが。

で、手元で動作確認した感じだと SetProcessAffinityMask() も SetThreadAffinityMask() も目的は果たしているのは確認しました。となると Get の無い SetThreadAffinityMask() を使用する理由が分からなかったのです。

きっと技術的に問題があるからに違いない、と。
その後のコメントを見る限り、特に大きな理由は無さそうだったので納得しました。

【2194】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 ひよひよ  - 07/7/27(金) 0:12 -

引用なし
パスワード
   すんごい今更ですけど、

この場合
SetProcessAffinityMask
を使うことが必須ですね。

というのも、SetThreadAffinityMask では、プロセス自体が実行可能プロセッサを制限されている場合意図したようには動作しないためです。

CrystalCPUID の最新版ソースコードを確認したところ、RealTimeClock の部分だけ何故か SetThreadAffinityMask になってました。直しておこう。。。

【2195】Re:SetThreadAffinityMask() の実装につい...
←back ↑menu ↑top forward→
 ひよひよ  - 07/7/27(金) 0:16 -

引用なし
パスワード
   ▼ひよひよさん:
>CrystalCPUID の最新版ソースコードを確認したところ、RealTimeClock の部分だけ何故か SetThreadAffinityMask になってました。直しておこう。。。
と思ったけれど、RealTimeClockDlg で SetProcessAffinityMask を実行してしまうと、倍率変更機能など他の機能に悪影響を与えてしまう可能性が。

マルチスレッドだとホントこの辺超危険なことが起こりそうです。
CrystalCPUID 5.1 は色々分離しとこうっと。

40 / 376 ツリー ←次へ | 前へ→
  新規投稿 ┃ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索 ┃設定 ┃ホーム  
ページ:  ┃  記事番号:   
50622
(SS)C-BOARD v3.8(とほほ改ver2.1) is Free