マルチスレッドプログラム
いつもお世話になっております。
今回はマルチスレッドプログラムについてお聞きしたいです。
マルチコアCPUを使ってたとえば下記のようなことをしたいときに
for (int i = 0; i < 1000000; i++)
{
sum += i;
}
このまま計算するよりもいくつかスレッドを作って、計算量を分散させてから最後に足してやるほうが早いと思いまして、
現在Core2Quadが手元にありましたのでスレッドを4つ作って
スレッド1で0から250000まで
スレッド2で250001から500000まで
スレッド3と4も同様にして実際にやってみたのですが
スレッドなしの状態よりも倍くらい時間がかかってしまうようになってしまいました。
計算結果は同じになり、CPU使用率もシングル時が25%、マルチ時が100%になっているので意図したようにはできていると思います。
GetProcessAffinityMaskを使って、各スレッドにひとつづつコアを割り当てても同様でした。
実際に時間が4分の1に近くなると思っていたのですが2倍かかってしまったので不思議です。
どなたか上記のことを思惑通りに動かせそうな方法をご存知の方はご教授願います。
プログラムは全部は無理ですが重要そうなところは下記のとおりです。
スレッド作成部分
{
DWORD dwStart = ::timeGetTime();
_thread_handle[0] = (HANDLE)::_beginthreadex(NULL, 0, thread_first, NULL, CREATE_SUSPENDED, &_thread_first_id);
_thread_handle[1] = (HANDLE)::_beginthreadex(NULL, 0, thread_second, NULL, CREATE_SUSPENDED, &_thread_second_id);
_thread_handle[2] = (HANDLE)::_beginthreadex(NULL, 0, thread_third, NULL, CREATE_SUSPENDED, &_thread_third_id);
_thread_handle[3] = (HANDLE)::_beginthreadex(NULL, 0, thread_forth, NULL, CREATE_SUSPENDED, &_thread_forth_id);
for (int num = 0; num < 4; num++)
{
::ResumeThread(_thread_handle[num]);
}
::WaitForMultipleObjects(4, _thread_handle, TRUE, INFINITE);
for (num = 0; num < 4; num++)
{
::CloseHandle(_thread_handle[num]);
}
DWORD dwEnd = ::timeGetTime();
}
各スレッド部分
{
HANDLE hCurrent = ::GetCurrentProcess();
DWORD pamask, samask, patmp = 0;
int nRet = ::SetProcessAffinityMask(hCurrent, 0x0001);
::GetProcessAffinityMask(hCurrent, &pamask, &samask);
DWORD dwStart = ::timeGetTime();
_result1 = 0;
for (int multi = 0; multi < _multi; multi++)
{
for (DWORD i = 0; i < 100000/4; i++)
{
_result1 += i;
}
}
DWORD dwEnd = ::timeGetTime();
time1 = dwEnd - dwStart;
::_endthread();
return 0;
}
開発環境は
WindowsXP SP3
VisualStudio6.0 ATL/WTLです。
補足
有り難う御座います。 根本的な誤解は全体へと影響を及ぼし得ますので、 此の質問への回答は凄く助かりました。 因みに、下記のページでも、 ヒントだけでも構いませんから、 御教授を賜れませんでしょうか? http://okwave.jp/qa/q7748960.html 試験日直前で酷く焦っておりますので、 助けて頂けますと、幸甚に存じます。