簡體   English   中英

串行代碼比在C語言中僅使用一個線程慢得多?

[英]Serial code much slower than using only one thread in C?

因此,我正在使用線程進行一些基准測試,並編寫了以下代碼:

resp_threadless []和resp_threaded []是全局int數組,其大小為n;

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;
  }
}

我通過打電話給她來對第一個功能進行基准測試:

function();

第二個是這樣的:

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()調用多個線程不會並行化它,這只是一個測試,因為我的結果確實很奇怪,所以我決定看看使用SAME代碼的一個線程和一個函數會發生什么。

我在Intel Atom N270和NUMPROC = 1的Windows XP上進行了測試。

結果:序列號:1485 ms一個線程:425 ms

使用多處理器機器,甚至使用信號量來並行化線程完成的工作的代碼,我都有類似的結果。

有誰知道會發生什么事嗎?

編輯

顛倒順序,一次運行多次,等等...->不變

N更高->線程一按比例甚至更快

使用QueryPerformanceCounter()->不變

線程創建開銷->應該使線程更慢,而不是更快

原始代碼: http//pastebin.com/tgmp5p1G

這是cache hit問題。 我懷疑您按照問題描述的順序進行了基准測試。 首先調用該函數,然后調用該線程。 當您對此進行更詳細的基准測試時,您將觀察到以下原因:數據(sqrt)在高速緩存中可用,因此代碼執行得更快。 測試以證明:

  1. 在調用線程之前,請運行function()兩次,甚至更多次。 第二次調用function將已經給出更快的結果。
  2. 在函數之前調用線程,結果將相反。 該功能將顯示更好的結果。

原因:所有sqrt計算(或至少很多)都可以在緩存中使用,而不必重新計算。 那快很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM