VS2010多线程实现1
根据《多核计算与程序设计》,我做了一个书上的实验:
#include "stdafx.h"
#define _AFXDLL
#include "afxmt.h"
int _tmain(int argc, _TCHAR* argv[])
{
CRITICAL_SECTION cs;
int i = 0;
clock_t t1, t2;
InitializeCriticalSection(&cs);
t1 = clock();
for (i = 0; i < 10000000; i ++)
{
EnterCriticalSection(&cs);
LeaveCriticalSection(&cs);
}
t2 = clock();
printf("Task1 for 10000000, time=%ldms\n", t2 - t1);
#pragma omp parallel for num_threads(2)
t1 = clock();
for (i = 0; i < 10000000; i ++)
{
EnterCriticalSection(&cs);
LeaveCriticalSection(&cs);
}
t2 = clock();
printf("Task2 for 10000000, time=%ldms\n", t2 - t1);
DeleteCriticalSection(&cs);
return 0;
}
我的机器是AMD APU3620:4核,2.2GHz。
得到的结果是:
Task1 for 10000000, time=355ms
Task2 for 10000000, time=338ms
和书上的结论不太一样。他是双核,1.8G,结果分别是577ms和1872ms。
那么我们把线程数扩大到4怎么样呢?——结果分别是322和320,
那么我们把线程数扩大到8怎么样呢?——结果分别是357和327。
有点奇怪啊。我在临界段中加上一些代码,结果也是非常接近的。难道AMD的CPU比较牛叉?
Task2 for 10000000, time=338ms
和书上的结论不太一样。他是双核,1.8G,结果分别是577ms和1872ms。
那么我们把线程数扩大到4怎么样呢?——结果分别是322和320,
那么我们把线程数扩大到8怎么样呢?——结果分别是357和327。
有点奇怪啊。我在临界段中加上一些代码,结果也是非常接近的。难道AMD的CPU比较牛叉?