准备着手学点并行计算方面的东西,找了半天,发现openMP比较容易下手,于是到网上找了点代码看。起来弄了个例子,如下:
int
main(int argc, char * argv[])
{
clock_t t1 = clock();
#pragma
omp parallel for
for ( int j = 0; j < 4; j++ ){
test();
}
clock_t t2 = clock();
printf("Total time = %d/n" , t2-t1);
test();
return 0;
}
然后在 在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就OK了,运行一下,结果很是爽。
可是后来拿到我的ubuntu下一跑就出了问题,单个运行约300多ms,并行部分每个却用了1000多ms,感觉做了四次(我的是四核机器),看了老半天,实在不知道怎么回事,后来,科学院崔涛博士来我们这里讲课,他让我把时间用下面这种方式计算 :
#include <omp.h>
#include <stdio.h>
#include <sys/time.h>
void test()
{
int a = 0;
long i;
struct timeval st, et;
gettimeofday( &st, NULL );
for (i = 0; i <100000000 ; i++)
{
a = i+1;
//printf("%ld ",i);
}
gettimeofday( &et, NULL );
if( et.tv_usec < st.tv_usec )
{
et.tv_sec = et.tv_sec - st.tv_sec - 1;
et.tv_usec = et.tv_usec + (1000000 - st.tv_usec);
}
else
{
et.tv_sec -= st.tv_sec;
et.tv_usec -= st.tv_usec;
}
printf("thread_num=%d, Time = %i.%06i sec/n", omp_get_thread_num(),et.tv_sec, et.tv_usec);
}
int main(int argc, char* argv[])
{
int j=0;
struct timeval st, et;
gettimeofday( &st, NULL );
#pragma omp parallel for
for (j = 0; j < 16; j++ )
{
test();
}
gettimeofday( &et, NULL );
if( et.tv_usec < st.tv_usec )
{
et.tv_sec = et.tv_sec - st.tv_sec - 1;
et.tv_usec = et.tv_usec + (1000000 - st.tv_usec);
}
else
{
et.tv_sec -= st.tv_sec;
et.tv_usec -= st.tv_usec;
}
printf("Time = %i.%06i sec/n", et.tv_sec, et.tv_usec);
return 0;
}
结果很成功,不过很是郁闷,-被一个这样的问题搞了这么久,而且还不知道原因。崔博士说可是在linux里clock()函数可能会有些问题。
不管了,问题解决就好,真的很谢谢崔博士。他给我们讲了几天MPI编程,很清晰,也让我很佩服,他是科学院数学所的,计算机能到如此地步实在让我羞愧,不过他也激励了我更好地学习,我也明白了与牛人交流会多有用。去年有幸跟北大的李若教授交流过,他的计算机和编程功底也是让一般的计算机老师都自叹不如的,他跟崔一样,也是计算数学的牛人。 在曙光装并行机期间,我也有幸碰到了他们的首席技术工程师何牧君,科学院过过程所的牛人,好像原来是研究化学的,我桌上有本书就是他读书时他们那个研究组出的。他的计算机那个精啊,我都不知道怎么表达,反正我在边上看他弄机器里,那手速不亚于我们咱上那些魔兽高手。期间我装一个结点上的一些包用了三四十分钟,他用几个命令十分钟左右就装了四个结点,我那一个佩服啊。总结下这三位牛人,都很年轻而且都是用Linux系统的,搞和我现在都不想用windows了。不知道我再过几年能不能除了外表和年龄外,在知识和能力上能有些许相似。不写了,加油吧!~~~~