pr编译影片时出错时CPU飙升到100%是怎么回事

调整gcc CPU参数优化代码编译 | Linux运维笔记
我的图书馆
调整gcc CPU参数优化代码编译 | Linux运维笔记
一般情况下,用户选择安装方式为rpm包或者二进制压缩包,但是,通用安装包为了适应不同的软硬件平台,都会采用保守的源码编译方式,并使用特定的gcc参数可以使编译出的程序执行效率有较大提升。
gcc优化参数都是通过export命令设定CFLAGS和CXXFLAGS,然后configure的时候会自动读入,make的时候会自动使用所选的优化参数。通过添加优化参数,让程序针对某个CPU型号和某个系统进行最大优化,减少文件大小、CPU使用率、内存使用率。优化后的程序,将不再具有跨系统跨平台的能力。
Alibaba大牛通过调整gcc的编译参数,使 5.1.46sp1企业版,比 5.1.47 Server性能高出15%,并非常稳定的运行在开发测试库上。
gcc CPU参数优化已经作为可选项添加到《》
首先查看CPU信息,然后根据CPU信息到《》、《》去获取CPU优化参数。
# cat /proc/cpuinfo
: GenuineIntel
cpu family
model name
: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
cache size
: 20480 KB
physical id
initial apicid
fpu_exception
cpuid level
: fpu de tsc msr pae cx8 sep cmov pat clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl nonstop_tsc pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes hypervisor lahf_lm ida arat epb pln pts dtherm
clflush size
cache_alignment : 64
address sizes
: 46 bits physical, 48 bits virtual
power management:
从cupinfo的信息可以看出,支持sse/sse2/mmx这些GCC的flag,查看gcc参数优化选项参考文档:[、]。
我这里的操作系统是64位,在编译源码之前执行如下代码即可调整gcc参数
export CHOST="x86_64-pc-linux-gnu"
export CFLAGS="-march=nocona -O3 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"
注意:gcc-4.2以上版本支持 -march=native 参数,gcc会自动选择最适合cpu的优化
-march=native 让它自己判断,是否支持native用下面的命令看看结果是否正常,和文档获取的参数不大相同
# touch o.c;gcc -v -march=native o.c 2&&1 | grep -o -- "-march[^ ]*" && rm -rf o.c
-march=core2
Fri Sep 27 21:32:52 CST 2013
TA的最新馆藏
喜欢该文的人也喜欢volatile关键字
内存屏障可以限
内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,使得CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。
大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。
语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。
举例说明:
volatile int i=10;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。
其中编译器编译优化是:
由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。
内存屏障可以限制CPU对内存的访问,表现在编程语言上就是上锁!
内存屏障可以限制CPU对内存的访问,表现在高级编程语言中就是加锁
内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,使得CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。
大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。
语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。
内存屏障,在x86
上是”sfence”指令,强迫所有的、在屏障指令之前的 存储指令在屏障以前发生,并且让 store buffers 刷新到发布这个指令的
CPU cache。这将使程序状态对其他 CPU 可见,这样,如果需要它们可以对它做出响应。
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 1974 人关注过本帖
标题:编译生成exe文件运行cpu 占用率100%????,任务管理器进程不能结束?消息死循 ...
等 级:新手上路
帖 子:19
&&问题点数:0&&回复次数:7&&&
编译生成exe文件运行cpu 占用率100%????,任务管理器进程不能结束?消息死循环吗?
我是vc++菜鸟,写windows程序时,编译生成exe文件运行cpu 占用率100%????
我是vc++菜鸟,写windows程序时,编译生成exe文件运行cpu 占用率100%????
#include &windows.h&
#include &stdio.h&
#include &string.h&
LRESULT CALLBACK WinProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
&&&&&&&&&&&&HWND hW
&&&&&&&&&&&&MSG M
&&&&&&&&&&&&WNDCLASS WndC
&&&&&&&&&&&&WndClass.hInstance=hI
&&&&&&&&&&&&WndClass.lpfnWndProc=WinP
&&&&&&&&&&&&WndClass.lpszClassName=&whyan&;
&&&&&&&&&&&&WndClass.lpszMenuName=NULL;
&&&&&&&&&&&&WndClass.style=0;
&&&&&&&&&&&&WndClass.cbClsExtra=0;
&&&&&&&&&&&&WndClass.cbWndExtra=0;
&&&&&&&&&&&&WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
&&&&&&&&&&&&WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
&&&&&&&&&&&&WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
&&&&&&&&&&&&RegisterClass(&WndClass);
&&&&&&&&&&&&hWnd=CreateWindow(&whyan&,&whyan&,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
&&&&&&&&&&&&ShowWindow(hWnd,SW_SHOWNORMAL);
&&&&&&&&&&&&UpdateWindow(hWnd);
&&&&&&&&&&&&while(GetMessage(&Message,hWnd,0,0))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& TranslateMessage(&Message);
&&&&&&&&&&&&&&& DispatchMessage(&Message);
&&&&&&&&&&&&}
&&&&&&&&&&&&return Message.wP
LRESULT CALLBACK WinProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM lParam)
&&&&&&&&&&&&HDC
&&&&&&&&&&&&HBRUSH
&&&&&&&&&&&&HPEN
&&&&&&&&&&&&PAINTSTRUCT
&&&&&&&&&&&&&&&
&&&&&&&&&&&&switch (Message)
&&&&&&&&&&&&{
&&&&&&&&&&&&case WM_PAINT:
&&&&&&&&&&&&&&& hdc=BeginPaint(hWnd,&pstr);
&&&&&&&&&&&&&&& SetMapMode(hdc,MM_ANISOTROPIC);
&&&&&&&&&&&&&&& pen=(HPEN)GetStockObject(BLACK_PEN);
&&&&&&&&&&&&&&& hbrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
&&&&&&&&&&&&&&& SelectObject(hdc,hbrush);
&&&&&&&&&&&&&&& SelectObject(hdc,pen);
&&&&&&&&&&&&&&& RoundRect(hdc,50,120,100,200,15,15);
&&&&&&&&&&&&&&& EndPaint(hWnd,&pstr);
&&&&&&&&&&&&case WM_DESTROY:
&&&&&&&&&&&&&&& PostQuitMessage(0);
&&&&&&&&&&&&&&&
&&&&&&&&&&&&default:
&&&&&&&&&&&&&&& return(DefWindowProc(hWnd,Message,wParam,lParam));
&&&&&&&&&&&&}
&&&&&&&&&&&&//return 0;
搜索更多相关主题的帖子:
&&&&&&&&&&
等 级:业余侠客
帖 子:291
专家分:228
你的消息获取函数GetMessage(&Message,hWnd,0,0))指定只是获取窗口的消息所以当你运行程序的时候由于窗口刚开始没有消息产生,所以while循环会马上陷入死循环,所以你把GetMessage函数的第二个参数变为NULL,还有你的switch语句中的case 后面没加如果这样你的窗口会刚一创建就会被销毁
等 级:新手上路
帖 子:19
高手就是高手
谢谢指导,请问你有QQ吗,想拜你为师,以后多多指导!!
等 级:业余侠客
帖 子:291
专家分:228
呵呵,其实我是把你的程序和我原来写的程序一行行的比对才发现的问题,所以我也不见得比你厉害
等 级:新手上路
帖 子:19
你有没有QQ?网海无边,知音难求?交个朋友好吗?
你有没有QQ?网海无边,知音难求?交个朋友好吗?
等 级:新手上路
帖 子:19
你跟我回复的菜单是什么意思,不是很懂!解释下行吗?
wc.lpszMenuName&&&&&= MAKEINTRESOURCE(LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU)));
等 级:业余侠客
帖 子:291
专家分:228
就是加载菜单ID为IDR_MENU的菜单到窗口
版权所有,并保留所有权利。
Powered by , Processed in 0.130918 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 编译影片时出错 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信