ネタ元 → 今更Sleepの解説するなんて、と思うのです。
マザボとっかえました。病巣は見つけられなかったけど臓器不全と思われます。
# 片桐姐さん臓器提供(マザボ、バックパネルとオマケ)ありがとです。
# いつか仕返しお返しいたしますねー♪
で、いそいそとVisual Studio 2010をインスコしたわけだが、IDEの調子が芳しくない。
メニューやインテリセンスで出てくるDropDownの表示が乱れる。つか見えねー orz
ちょいと旧いGPU(on-boardのRADEON X1250かな?)なんでDirectXサポートができてないのかな?
ってんで横浜ヨドバシにひとっぱしり、グラボ買ってきますた。
AMD機だから相性イイんじゃなかろかとRADEON HD5450、5000番台のショボいやつね。
臓器移植したらばさっくし解決しましたなり。めでたしめでたし。
快調に動き始めたVisual Studio 2010での手習いコードのお題は
「Sleepが仕事するわけねーだろ」をコードで示す、です。
Sleepがホントに仕事してる(寝てる間スレッドを握ったまま)なら
Sleep(1000) つまり一秒待ちをN個のスレッドで実行すれば
N÷論理コア数[秒]で完了すっでしょね。
#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
// 一秒待つスレッド
DWORD WINAPI Sleep1second(LPVOID) {
Sleep(1000);
return 0;
}
int main() {
for ( int nthreads = 1; nthreads < 20; ++nthreads ) {
vector<HANDLE> handles;
// N個のスレッドに火をつけて
for ( int i = 0; i < nthreads; ++i ) {
DWORD thread_id;
HANDLE handle = CreateThread(0, 0, &Sleep1second, 0, 0, &thread_id);
handles.push_back(handle);
}
// 全スレッドが終わるまでの時間を測定する
DWORD tick = GetTickCount();
WaitForMultipleObjects(nthreads, &handles[0], TRUE, INFINITE);
cout << nthreads << " : " << GetTickCount() - tick << endl;
for ( int i = 0; i < nthreads; ++i ) {
CloseHandle(handles[i]);
}
}
}
結果:
1 : 998
2 : 1014
3 : 998
4 : 999
5 : 1014
6 : 998
7 : 998
8 : 999
9 : 998
10 : 1014
11 : 999
12 : 998
13 : 998
14 : 999
15 : 999
16 : 998
17 : 999
18 : 998
19 : 1014
スレッド20個起こしても処理時間は1秒。その間パフォーマンスメータは地べたを這ってます。
dual-coreでの結果ですが、coreを一個殺してsingle-coreでも同様です。
よーするにSleepじゃ処理効率の測定なんかできっこねぇのね。だって処理してねーもん。
『OpenMPの実行時ライブラリと並列ループ』の4ページ目最後のコードとその考察には妥当性がないのですわ。