永发信息网

C++ openmp并行程序在多核linux上如何最大化使用cpu

答案:2  悬赏:70  手机版
解决时间 2021-04-03 02:27
C++ openmp并行程序在多核linux上如何最大化使用cpu
最佳答案
openmp并行程序在多核linux上最大化使用cpu的方法如下:

#include 
#include 
#include 
#include 

int main()
{
    long long i;
    long double sum = .0;
    long double sec = .0;

    // Multi-thread compute start
    clock_t t1 = clock();
    #pragma omp parallel for
    for (i = 0; i < 1000000000; i++)
    {
        sum += i/100;
    }
    clock_t t2 = clock();

    sec = (t2 - t1);
    //sec = (t2 - t1);
    printf("Program costs %.2Lf clock tick.
", sec);
    exit(EXIT_SUCCESS);
}以上代码中,#pragma omp parallel for

这一行的作用即是调用openmp的功能,根据检测到的CPU核心数目,将for (i = 0; i < 1000000000; i++)这个循环执行过程平均分配给每一个CPU核心。

去掉#pragma omp parallel for这行,则和普通的串行代码效果一致。
注意,要使用openmp功能,在编译的时候需要加上-fopenmp编译参数。
以下是两种编译搭配两种代码出现的4种结果,可以很直观地看到效果:
1、代码里含有#pragma omp parallel for,编译参数有-fopenmp
Endys-MacBook-Pro:Desktop endy$ vi test.c 
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp
Endys-MacBook-Pro:Desktop endy$ ./test 
Program costs 50202611.00 clock tick.


2、代码里含有#pragma omp parallel for,编译参数没有-fopenmp
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test
Endys-MacBook-Pro:Desktop endy$ ./test 
Program costs 4068178.00 clock tick.

3、代码里没有#pragma omp parallel for,编译参数有-fopenmp
Endys-MacBook-Pro:Desktop endy$ vi test.c 
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test -fopenmp
Endys-MacBook-Pro:Desktop endy$ ./test 
Program costs 4090744.00 clock tick.

4、代码里没有#pragma omp parallel for,编译参数没有-fopenmp
Endys-MacBook-Pro:Desktop endy$ vi test.c 
Endys-MacBook-Pro:Desktop endy$ gcc-6 test.c -o test
Endys-MacBook-Pro:Desktop endy$ ./test 
Program costs 4170093.00 clock tick.


可以看出,只有在情况1下,openmp生效,其他3种情况下,均为单核运行,2、3、4结果较为接近,而1的运行结果大约相差25%。
值得注意的是,使用多核心的case 1竟然比单核的其他3种case慢了25%,原因是在这种单一的循环运算中,并行分配CPU任务的指令比直接执行下一个循环指令的效率更低。所以并不是用并行运算就一定能够提高运算效率的,要根据实际情况来判断。



全部回答
OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。
OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用,在这样的系统上,MPI使用较多。
当然,还有一个更简单的方法就是使用Go语言。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
问个非常严肃的问题,犯罪团伙过了边境线真的
重庆渝北和江北有什么区别?
4米50厘米=多少米
为什么男朋友喜欢提以前的事情?
朋友们,“让心情好好放一个假”是哪首歌里的
海南开发区为什么失败
EDFA的优点与主要用途
为什么选择三生创业平台
赤褐色造句
涉嫌诈骗,问一下,涉嫌是什么意思
庚金生于辰月的用神
所谓名品 除了名牌解释,还有如何定义?
蓝岸婚礼定制地址在哪,我要去那里办事
球球大作战名字变成空白怎么弄?就是别人看不
五点四乘以3/5+3.6除以5/3+0.6
推荐资讯
诛字打一成语成语玩命猜
今天中国最强的家族?
外表文静内敛内心是爆发的小宇宙的人取个名字
韩剧火星生活男主母亲谁演的
b亅40自动档什么价?
双向楼梯与楼板处无梁如何处理
yy语音中麦序是什么东西
火币网里面比特币提现地址是什么
萌宝的小屋韩国馆这个地址在什么地方,我要处
慢走丝统赢一出二机型后处理加什么代码
泰国最著名的体育运动
k82次列车7号车厢118号坐靠窗吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?