新版的GCC编译器都支持OpenMP。在程序中需要引入omp.h头文件,另外在编译时需要指定-fopenmp选项。
#include#include #include void test(){ int a=0; clock_t t1=clock(); for(int i=0;i<10000000;i++){ a=i+1; } clock_t t2=clock(); printf("Test Time=%ld\n",t2-t1);}int main(int argc,char *argv[]){ clock_t t1=clock();#pragma omp parallel for for(int j=0;j<2;j++){ test(); } clock_t t2=clock(); printf("Total time=%ld\n",t2-t1); test(); return 0;}
orisun@zcypc:~$ g++ test.c -o ly
orisun@zcypc:~$ ./lyTest Time=30000Test Time=30000Total time=60000Test Time=30000可以看到编译时不指定-fopenmp选项,跟串行编程是一样的效果。
orisun@zcypc:~$ g++ test.c -o ly -fopenmp
orisun@zcypc:~$ ./lyTest Time=70000Test Time=70000Total time=70000Test Time=50000使用默认的线程数,单独运行test()函数需要50000毫秒,并行再次运行test()函数需要70000毫秒。.
可以显式指定线程数:
orisun@zcypc:~$ export OMP_NUM_THREADS=2
orisun@zcypc:~$ ./lyTest Time=60000Test Time=70000Total time=70000Test Time=60000orisun@zcypc:~$ export OMP_NUM_THREADS=4
orisun@zcypc:~$ ./lyTest Time=60000Test Time=60000Total time=70000Test Time=30000如何查看默认情况下使用的线程数呢?
#include#include void main(int argc,char * argv[]){#pragma omp parallel { printf("Hello OpenMP!ThreadID=%d\n",omp_get_thread_num()); }}
orisun@zcypc:~$ gcc num.c -o num -fopenmp
orisun@zcypc:~$ ./numHello OpenMP!ThreadID=0Hello OpenMP!ThreadID=1说明在我的机子上默认使用2个线程。
或者在程序中指定线程数:
#pragma omp parallel num_threads(8);
这里就有一个问题了:根据第一次运行结果可知不使用OpenMP的话text()函数一次运行只需30000毫秒,而使用OpenMP后,不论线程数设为多少,两次运行test()函数都是需要70000毫秒。----并行反而降慢了速度?
补充一个小技巧--修改gcc的默认编译选项:
在.bashrc中添加一行:export CFLAGS="-O3 -march=core2" && CXXFLAGS=$CFLAGS
这里的core2是<cpu类型>,其实你cat /proc/cpuinfo只要是cpu family : 6model : 15, 23,26,37就可以用core2