rub*_*ack 6 c parallel-processing multithreading
所以,我正在用线程做一些基准测试,我写了这些代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我通过调用她来对第一个函数进行基准测试:
function();
Run Code Online (Sandbox Code Playgroud)
第二个是这样的:
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]);
Run Code Online (Sandbox Code Playgroud)
请记住,我知道使用function_th()调用多个线程不会并行化它,这只是一个测试,因为我有非常奇怪的结果,所以我决定看看使用SAME代码的一个线程和一个函数会发生什么.
我在Intel Atom N270和Windows XP上用NUMPROC = 1测试了这个.
结果:串行代码:1485 ms单线程:425 ms
我使用多处理器机器得到了类似的结果,甚至使用信号量的代码来并行化线程完成的工作.
有没有人知道会发生什么?
编辑
反转顺序,每次运行多次,等等...... - >没有变化
更高的N - >线程1比例更快
使用QueryPerformanceCounter() - >无变化
线程创建开销 - >应该使线程更慢,而不是更快
这是一个cache hit
问题。我怀疑您按照问题中描述的顺序进行了基准测试。首先调用函数,然后调用线程。当您更详细地进行基准测试时,您将观察到原因:数据(sqrt)在缓存中可用,因此代码执行速度会更快。
测试证明:
function()
两次甚至更多次。对函数的第二次调用将给出更快的结果。原因:所有 sqrt 计算(或至少很多)都在缓存中可用,无需重新计算。这样就快多了。