カテゴリー: C#
Visual Studio 2010 Parallel – Process
シーケンシャルだと
var query = from proc in System.Diagnostics.Process.GetProcesses() select proc;
foreach (var process in query)
{
Console.WriteLine(process.Id + " : " + process.ProcessName);
}
これがパラレルだと、
var query = from proc in System.Diagnostics.Process.GetProcesses() select proc;
Parallel.ForEach(query, process =>
{
Console.WriteLine(process.Id + " : " + process.ProcessName);
}
);
処理的には、パラレルでもシーケンシャルでも関係ないので、パラレルで実行しているほうが処理する人の感覚(意図)に近いのかもしれない。
Visual Studio 2010 Parallel
Visual Studio 2010 beta を入れてみた。
using System.Threading;
using System.Diagnostics;
…
Stopwatch sw = new Stopwatch();
sw.Start();
Parallel.For(0, 10, x =>
{
Console.WriteLine(x.ToString() + " : " + Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(5000);
}
);
sw.Stop();
…
実行結果
x : ManagedThreadId
————-
0 : 8
5 : 10
1 : 11
6 : 12
2 : 13
7 : 14
3 : 15
4 : 8
8 : 10
9 : 10
こんなことができてしまうなんて・・・
Codeseek 勉強会のWinRing0の資料をアップしました。
「宇宙仮面のWinRing0」
(共催:tk-engineering、こみゅぷらす、eパウダ~、.Net/C# Group)
開催日:2009年5月19日(火) 19:00~21:00 18:55に6F受付集合
場所:マイクロソフト社新宿オフィス6F会議室
募集締め切り:2009年5月16(土)23時59分59秒
20名まで
参加費無料
CPUの温度取得に関するメモ4
Intel® 64 and IA-32 Architectures Software Developer’s Manual によると、今使用中の ASUS P5LD2-V + Pentium 4 D では、MSR から CPU の温度が取れないことが判明した。
で、http://kariunten.homeip.net/programming/winring0.html
にマザーボードのI/Oコントローラからデータを取得する方法が載っていたので、OpenLibSys で試してみた。
ASUS P5LD2-Vのマニュアルを調べてみると、コントローラは W83627EHF だったので、そのマニュアル
http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_W83627EHG.pdf
を調べてみた。それによると、このチップには温度センサーが3つ搭載されている。ただし、マザーボード上で使用されているのは、CPUTIN Temperature、SYSTIN Temperature の2つのみで、AUXTIN Temperatureは使用されていない模様。
このコントローラーからデータを取得するには、IO ポートからデータを取得すればよい。
取得する方法は、0x295 ポートにレジスタを指定、0x296 ポートからデータを取得するという手順。
ただし、バンクが 0, 1, 2, 3, 4 とあり、0x50 以上のレジスターにアクセスするには、バンクを切り替える必要がある。バンクの切り替え方法は、0x4E ポートの下位3ビットで指定する。
CPUTIN (CPUの温度)は、
バンク1、0x50 レジスタにハイビット(温度 ℃)
バンク1、0x51 レジスタにロービット(温度 7ビット目が立っていれば +0.5℃)
となっているので、次のようなコードになる。
//=======================================
// CPUTIN Temperature
//=======================================
// バンク1
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(50h Bank1)
ols.WriteIoPortByte(0x295, 0x50);
hi = ols.ReadIoPortByte(0x296);
// バンク1
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(10h Bank1)
ols.WriteIoPortByte(0x295, 0x51);
lo = ols.ReadIoPortByte(0x296);
Console.WriteLine("CPUTIN Temperature Low : …." + lo.ToString("X") + "\r\n");
Console.WriteLine("CPUTIN Temperature High: …." + hi.ToString("X") + "\r\n");
float CPUTIN = hi + ((lo & 0x80) != 0 ? 0.5f : 0);
Console.WriteLine("CPUTIN Temperature: …." + CPUTIN.ToString() + "\r\n");
同様に、SYSTIN (マザーボードの温度)は、バンク0、0x27 レジスタなので、
//=======================================
// SYSTIN Temperature
//=======================================
// バンク0 を指定
ols.WriteIoPortByte(0x295, 0x4E);
ols.WriteIoPortByte(0x296, 0x81);
// データ読出し(27h Bank0)
ols.WriteIoPortByte(0x295, 0x27);
hi = ols.ReadIoPortByte(0x296);
Console.WriteLine ("SYSTIN Temperature: …." + hi.ToString() + "\r\n");
なお、SYSTINでは、0.5℃単位の測定はできない仕様になっている。
結果は次の通り。
[CPUTIN Temperature]
CPUTIN Temperature Low : ….80
CPUTIN Temperature High: ….21
CPUTIN Temperature: ….33.5
[SYSTIN Temperature]
SYSTIN Temperature: ….24
下は、ASUS のおまけアプリの Probe II のデータ
おおおおっ、ちゃんと取れるじゃないですか。OpenLibSys 偉大だ。
というか、Core2にアップしてしまえば、MSRで取れるので、こんなことしないですむんだけどなぁ・・・
というか、こんなハード固有の実装させないように頑張ってよ >> MS
というか、温度を気にしないといけないような CPU 勘弁してよ >> Intel, AMD
CPUの温度取得に関するメモ3
MSR(Model Specific Register) 0x19C Bits [22:16] で温度が取得できることは確認できたが、このセンサーの値は、Tjmax への相対値であることがマニュアルに書かれている。しかし、そのTjmaxの値をMSRから取得する方法がマニュアルに書かれていない。
いろいろ探していたらば、
http://software.intel.com/en-us/forums/deleted-posts/topic/51574/page/1/
で、MSR 0xEE で取得が可能なようだが、undocumented だそうだ。ちょっと古い資料なので、85度か100度と書かれている。
http://www.xtremesystems.org/forums/showthread.php?t=179044&page=23
によると、0xEE の bit:30 で、0=100 1=85 といううわさもある。
一方、Q6600 では、95度らしいという書き込みもある。
http://www.xtremesystems.org/forums/showthread.php?t=179044&page=27
Atom の場合、20度室温で 0x19C Bits [22:16] から88前後が返されているので、100度にしても合わない。
http://download.intel.com/design/processor/datashts/320032.pdf
によると、a catastrophic processor temperature of 125°C (maximum), or if the THERMTRIP#
signal is asserted, ということで、125度とすると、ちょうど37度となり、それらしい値になる。
MSR 0xEE で取得してみると、
000000EE: 00000000 02F90002
となり、仕様が分からない。
http://www.bugtrack.almico.com/view.php?id=1150
によると、
if bit 30 of MSR(0x00EE) is 1 then
Tjmax=85
else
Tjmax=100
endif
if CPUID=0x06F2 then Tjmax=100
if CPUID=0x06FB then Tjmax=100
if CPUID=0x10676 then Tjmax=Tjmax+5
こんな情報もある。
それにしても、xtremesystems.org のスレッドがものすごいことになっているのには、驚いた。
いずれにしても、インテルが仕様をはっきり書いていない(NDAを結ばないともらえないらしい)のが悪いということがよくわかった。
CPUの温度取得に関するメモ2
石坂さん、渋木さんに教えていただいたサイドバーガジェットを Windows 7 Beta on Atom N280で動かしてみました。こんな感じ。
原理はデバイスドライバーで、Ring0のカーネルモードに移行して、そこでアセンブラでRDMSRにより、Model Specific Register を叩いて、直接モードスペシフィックレジスターからデータを読み取っていますね。そのためのライブラリがOpenLibSysから提供されている。なるほど、それなら早いはずだ。それにしても、OpenLibSysを作った人は偉いなぁ・・・とひとしきり感動しました。
なお、Vista on Pentium4 Dでは、温度が取得できない。orz。MSR的には、0x19C の 22:16 で同じ仕様に見えるんだけど、どこか細かいところで違うのかな・・・
なお、MSRは、文字通りモデル固有のレジスタであるため、プロセッサのモデルごとに仕様が異なっている。Intel のIntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3Bによると、Core2、Atom、P4 and Xeon、Core Solor and Core Duo、Pentium M、P6、Pentiumとファミリーごとに説明が分かれています。
CPU 温度の取得に関するメモ
だんだんと暑い季節になってきて、Core2ではない Pentium 4 Dにとっては、辛い季節になってきました。室温が上がると、調子が悪くなるので、まじめに深刻な問題です。そこで、先日ケースにファンを増設したら、だいぶ効果があるようで、35度ぐらいでおちついていますが、CPUの温度のモニタリングしたいと思って、ちょっと調べてみました。
WMI の “Win32_TemperatureProbe” が一番まともな方法のようだが、現在のPC “ASUS P5LD2-V”, eee PC 1000 HE では、このインターフェースがサポートされていない模様。
いろいろ調べてみると、MSAcpi_ThermalZoneTemperature を使った記事がいくつかある
が、そもそもそんな I/F の情報は MSDNに載っていない。もう使われていないということか?
さらに調べてみると、
http://kariunten.homeip.net/programming/winring0.html
にマザーボードのコントローラを直接操作する方法が載っていた。そうきますか~~~w。
と思って、そのコードを見てみると、
で、Windowsからハードウェア(I/O port, MSR, PCI bus, and etc…)へのアクセスを可能とする WinRing0 が提供されているコードを利用している。
さらに、そこから
http://www.techpowerup.com/realtemp/
で、all Intel single Core, Dual Core, Quad Core and Core i7、さらにはNvidia のGPUの温度まで取得できるプロジェクトを発見。
試してみたが、Pentium 4 Dは、サポートされていない;;
eee PC 1000 HE の Atom N280だと? 1℃ ! すばらしい CPUだ w
ASUS からProbe II というモニターツールがあるから問題ないんだけどね。
温度、ファン回転数ぐらい WMI でちゃんと取れるようにしてよね。>> MS
それより、せめてCore2にしろよという突っ込みは却下。
Visual Studio 2008 の修復インストール、アンインストールができない
Visual Studio 2008の調子が悪く、ASP.NETの開発ができなくなってしまった。特に何もしていないのに突然の症状。原因不明。しかたないので、修復セットアップしようとしたら、セットアップもできなくなっている。
アンインストールもできない。困ったと思っていたら、
もりさんのページで、
Visual Studio 2008 自動アンインストールツールが公開されています。
が紹介されていた。
Visual Studio 2008 をアンインストールする
http://msdn.microsoft.com/ja-jp/vstudio/bb968856.aspx
無事安易ストール完了。
さて、インストールしますか。
・・・1時間後、インストール無事終了。起動してみると、ブルースクリーンでVista 落ちた。
再起動後、WebApplication を作ってみただけで、
ということで、なんかすごくおかしくなっている。
WinForm は問題なくプロジェクトの作成、実行ができる。
IISがらみか?
RDF を LINQ で読む
string gooRankingUrl = "http://ranking.goo.ne.jp/rss/keyword/keyrank_all1/index.rdf";
XDocument feedXML = XDocument.Load(gooRankingUrl);
XNamespace d = "http://purl.org/rss/1.0/";
XNamespace dc = "http://purl.org/dc/elements/1.1/";
var res = from item in feedXML.Descendants(d + "item")
select new
{
Title = item.Element(d + "title").Value,
Link = item.Element(d + "link").Value,
PubDate = (item.Element(dc + "date").Value ?? ""),
Publisher = (item.Element(dc + "publisher").Value ?? ""),
Rank = (item.Element(dc + "rank").Value ?? ""),
Point = (item.Element(dc + "point").Value ?? ""),
Arrow = (item.Element(dc + "arrow").Value ?? ""),
Description = (item.Element(d + "description").Value ?? ""),
Guid = item.Element(d + "link").Value
};
GridView1.DataSource = res;
GridView1.DataBind();