用着双核的机器,跑着单进程的应用,忍不了它的缓慢,于是想找找怎么简单提升速度的方法。
下面这个文章是MSDN上讲怎么在VC++ 2005 里面用OpenMP的:http://msdn.microsoft.com/msdnmag/issues/05/10/OpenMP/
看了一下2003下面的工程,的确没有OpenMP的支持,看来要升级到2005啦。
另外是seavon同学的space上有一个她的学习心得,是在linux下面的:
http://seavon9.spaces.live.com/blog/cns!257B76F0ED0B0F19!786.entry
在我的双核机器VS2005上尝试了一下,
普通的c++工程,在project的property页面上的C/C++ -> Language 选项卡中将OpenMP Support这项设置为Yes,在需要使用OpenMP函数的cpp文件中引用"omp.h",这样设置就完成了。
写了后面的代码测试,发现了两点:
1. 写程序的时候进入parallel模块之前应该仔细确认后面用到变量的局部性问题,一般来说,凡是后面会“写”的变量都要逐一规定其共享方式,比如后面代码中的private(x) 和 reduction(+: sum)。
2. 并行的确有一定的作用:
不并行(注掉#pragma那行)的运行时间是135661197 ticks
并行(默认似乎是根据机器的处理器数分配线程的,我机器是双核,于是是双线程)运行时间是75405715 ticks
如果在代码中用omp_set_num_threads()设定并行的线程数,比如设为3,那么运行时间是104065248 ticks,确实比双线程要耗时一点;设为4的情况是88858420 ticks,这也符合双核机器的预期,也就是4线程均分比双线程多了overhead,但比3线程要好,因为没有cpu空闲。
void call()
{
int len = 1000000;
double x = 0;
double sum = 0;
#pragma omp parallel for private(x) reduction(+: sum)
for(int i=0;i<len;i++)
{
x = len-i;
x *= i;
x /= len;
x /= len;
sum += x;
}
printf("sum = %lf/n", sum);
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned __int64 start;
start = __rdtsc();
call();
unsigned __int64 end;
end = __rdtsc();
printf("%d ticks/n", end-start);
return 0;
}
并有以下参考 :
https://computing.llnl.gov/tutorials/openMP/