串行代码比在C中只使用一个线程慢得多?

时间:2012-10-21 21:48:25

标签: c multithreading parallel-processing

所以,我正在用线程做一些基准测试,我写了这些代码:

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()调用多个线程不会并行化它,这只是一个测试,因为我有非常奇怪的结果,所以我决定看看使用一个线程和一个函数会发生什么相同的代码。

我在Intel Atom N270和Windows XP上测试了这个,NUMPROC = 1。

结果: 串行代码:1485毫秒 一个线程:425毫秒

我使用多处理器机器获得了类似的结果,甚至使用信号量的代码来并行化线程完成的工作。

有没有人知道会发生什么?

修改

反转订单,每次运行多次,等等... - &gt;没有变化

更高的N - >线程1按比例更快

使用QueryPerformanceCounter() - &gt;没有变化

线程创建开销 - &gt;应该使线程更慢,而不是更快

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

1 个答案:

答案 0 :(得分:2)

这是一个cache hit问题。我怀疑你按照你在问题中描述的顺序做了基准测试。首先调用该函数,然后调用该线程。当您更详细地对此进行基准测试时,您将看到原因:数据(sqrt)在缓存中是可用的,因此代码执行速度会快得多。 测试以证明:

  1. 在调用线程之前运行function()两次甚至更频繁。 第二次调用函数会给出更快的结果。
  2. 在函数前调用线程,结果将显示相反的结果。 该功能将显示更好的结果。
  3. 原因:所有sqrt计算(或至少很多计算)都可以在缓存中使用,而不必重新计算。那要快得多。