2012-10-21 4 views
6

スレッドでいくつかのベンチマークテストを行いましたが、これらのコードを書きました。シリアルコードはC言語で1つのスレッドを使用するよりもはるかに遅いですか?

resp_threadless []とresp_threaded []はグローバルint配列であり、サイズはnです。

function(); 

そして、このような第二1:

HANDLE hThreadArray[1]; 
DWORD dwThreads[1]; 
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0])); 
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE); 
CloseHandle(hThreadArray[0]); 

私はfunction_thを使用して複数のスレッドを呼び出すことを知っていることに注意してくださいを

int n = 100000; 

void function() { 
    for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

DWORD WINAPI function_th(LPVOID lpParam) { 
for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

は、私はちょうど彼女を呼び出すことにより、第一の機能をベンチマーク()はそれを並列化しません。これは本当に奇妙な結果が出ていたため、これは単なるテストなので、SAMEコードを使用して1つのスレッドと1つの関数で何が起こるかを確認することにしました。

私はNUMPROC = 1

結果とインテルAtom N270、およびWindows XPでこれをテストした:私は使用して同様の結果を持っていた425ミリ

: シリアルコード:1485ミリ秒 つのスレッドセマフォを使用するコードであっても、スレッドによって行われた作業を並列化することができます。

誰が何が起こっている可能性について考えていますか?順序を反転

EDIT

、複数回にそれぞれ1を実行している、等... - >変更なし

高いNは - >スレッド1は、(QueryPerformanceCounterのを使用して、さらに高速比例

ではありません) - >変更なし

スレッド作成オーバーヘッドは - >スレッドの一つでも、遅くない速く作るべきではありません

元のコード:http://pastebin.com/tgmp5p1G

+0

あなたの現在のスレッド(あなたが 'function()'を呼び出す)に優先度が低いのでしょうか? – SomeWittyUsername

+2

1回のプログラム実行で2つのテストを連続して実行しましたか?私は 'vetor []'アクセスのためのデータキャッシュ効果を疑う。 – yohjp

+0

1.注文を元に戻してみましたか? (キャッシュ効果)2.どのように時間を測定しましたか? – Arno

答えて

2

これはcache hitです。私はあなたがあなたの質問でそれを記述した順序でベンチマークを行ったと思う。関数が最初に呼び出され、スレッドが後に呼び出されました。これをより詳細にベンチマークすると、その理由がわかります。データ(sqrt)はキャッシュ内で使用できるため、コードはより高速に実行されます。 prooveする テスト:スレッドを呼び出す前に二回またはそれ以上頻繁に

  1. 実行function()。 関数への2番目の呼び出しは、より速い結果を既に与えます。
  2. 関数の前にスレッドを呼び出すと、結果には逆の結果が表示されます。 この関数はより良い結果を示します。

理由:すべてのsqrt計算(または少なくともそれらの多く)はキャッシュで使用可能であり、再計算する必要はありません。それはずっと速いです。

+0

私はもう一方を逆にしようとしましたが、両方を何度も実行していて、同じ結果が出ました。 – ruback

+0

まあ、私はあなたのコードを使用し、それをexaclyでした。結果はかなり明確でした。 **再び:**あなたはどのように時間測定を行ったのですか?あなたは 'function() 'と' function_th() 'を5回連続して実行すると言うことができますか? – Arno

+0

私は実際に各機能を5回実行して平均を取得しています。 "(double)clock()/ CLOCKS_PER_SEC;を取得する時間を測定していますもう一方から1を減算する。 – ruback

関連する問題