<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erlang非业余研究 &#187; ERL_COMPILE_FLAGS</title>
	<atom:link href="http://blog.yufeng.info/archives/tag/erl_compile_flags/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.yufeng.info</link>
	<description>Erlang系统深度探索和应用</description>
	<lastBuildDate>Tue, 17 Jan 2012 06:05:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>系统标准库的hipe支持（高级）</title>
		<link>http://blog.yufeng.info/archives/9</link>
		<comments>http://blog.yufeng.info/archives/9#comments</comments>
		<pubDate>Sun, 23 Aug 2009 17:39:31 +0000</pubDate>
		<dc:creator>Yu Feng</dc:creator>
				<category><![CDATA[Erlang探索]]></category>
		<category><![CDATA[ERL_COMPILE_FLAGS]]></category>
		<category><![CDATA[hipe]]></category>
		<category><![CDATA[native]]></category>
		<category><![CDATA[o3]]></category>

		<guid isPermaLink="false">http://blog.yufeng.info/?p=9</guid>
		<description><![CDATA[原创文章，转载请注明： 转载自Erlang非业余研究 本文链接地址: 系统标准库的hipe支持（高级） 前篇文章http://mryufeng.javaeye.com/blog/428845 讲述了如何启用erlang hipe支持，但是用户程序大量依赖的标准库如stdlib, kernel等默认都不是native模式的， 所以我们的程序虽然启用了hipe,但是只是部分启用了。用oprofile等工具可以看到我们的程序还是在process_main（虚拟机的代码解释 在这里）里面打转。 我们来个极致的，通通hipe化。 有2个方案可以解决： 1. 在编译otp_src的时候 export ERL_COMPILE_FLAGS=&#8217;+native +&#8221;{hipe, [o3]}&#8221;&#8216; 但是这个方案有个问题就是 native方式是和beam的模式有关的 如beam和beam.smp它的代码是不同的，但是所有的beam又公用一套库，这样只能舍弃一个了。所以这个方案就比较麻烦。 这个也可以通过修改 alias erl=erl -smp disable 以便欺骗编译器生成单cpu模式的beam 去绕过去 2. 动态编译, 等系统运行起来以后，动态把相关的模块编译一遍，这个思路看起来最简单。 我做了个原型 证明这样是可行的。。。 。。。 看到了是用native模式编译的哦。。。 不过编译过程中有几个模块是有点问题， 得改进下。 Post Footer automatically generated by wp-posturl plugin for wordpress.]]></description>
			<content:encoded><![CDATA[<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://blog.yufeng.info/">Erlang非业余研究</a></p>
<p><strong>本文链接地址:</strong> <a href="http://blog.yufeng.info/archives/9">系统标准库的hipe支持（高级）</a></p>
</div>
<p>前篇文章<a href="http://mryufeng.javaeye.com/blog/428845" target="_blank">http://mryufeng.javaeye.com/blog/428845</a> 讲述了如何启用erlang hipe支持，但是用户程序大量依赖的标准库如stdlib, kernel等默认都不是native模式的， 所以我们的程序虽然启用了hipe,但是只是部分启用了。用oprofile等工具可以看到我们的程序还是在process_main（虚拟机的代码解释 在这里）里面打转。 我们来个极致的，通通hipe化。</p>
<p>有2个方案可以解决：<br />
1. 在编译otp_src的时候 export ERL_COMPILE_FLAGS=&#8217;+native +&#8221;{hipe, [o3]}&#8221;&#8216; 但是这个方案有个问题就是<br />
native方式是和beam的模式有关的 如beam和beam.smp它的代码是不同的，但是所有的beam又公用一套库，这样只能舍弃一个了。所以这个方案就比较麻烦。</p>
<pre class="brush: bash; title: ; notranslate">
# erl
Erlang R13B01 (erts-5.7.2) 1 [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.2  (abort with ^G)
1&gt;  %%没问题

#erl -smp disable
&lt;HiPE (v 3.7.2)&gt; Warning: not loading native code for module fib: it was compiled for an incompatible runtime system; please regenerate native code for this runtime system
....
Erlang R13B01 (erts-5.7.2) 1 [64-bit] [rq:1] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.2  (abort with ^G)
1&amp;gt;
</pre>
<p>这个也可以通过修改 alias erl=erl -smp disable 以便欺骗编译器生成单cpu模式的beam<br />
去绕过去</p>
<p>2. 动态编译, 等系统运行起来以后，动态把相关的模块编译一遍，这个思路看起来最简单。</p>
<p>我做了个原型 证明这样是可行的。。。</p>
<pre class="brush: bash; title: ; notranslate">
# cat hi.erl
</pre>
<pre class="brush: erlang; title: ; notranslate">
-module(hi).
-export([do/0]).

do()-&amp;gt;
[ turn(M, P)|| {M, P} &amp;lt;-code:all_loaded(), P=/=preloaded].

turn(M, P) -&amp;gt;
P1 = binary_to_list(iolist_to_binary(re:replace(filename:join(filename:dirname(P), filename:basename(P, &quot;.beam&quot;)), &quot;ebin&quot;, &quot;src&quot;))),
L = M:module_info(),
COpts = get_compile_options(L),

COpts1 = lists:foldr(fun({K, V}, Acc) when is_list(V) and is_integer(hd(V)) -&amp;gt;[{K, tr(V)}] ++ Acc ; (Skip, Acc) -&amp;gt; Acc ++ [Skip] end, [], COpts),
c:c(P1, COpts1 ++ [native, &quot;{hipe, [o3]}&quot;]).

tr(P)-&amp;gt;
binary_to_list(iolist_to_binary(re:replace(P, &quot;/net/isildur/ldisk/daily_build/otp_prebuild_r13b01.2009-06-07_20/&quot;, &quot;/home/yufeng/&quot;))).  %%%这个地方要根据实际情况调整 具体的参看 m(lists).

get_compile_options(L) -&amp;gt;
case get_compile_info(L, options) of
{ok,Val} -&amp;gt; Val;
error -&amp;gt; []
end.

get_compile_info(L, Tag) -&amp;gt;
case lists:keysearch(compile, 1, L) of
{value, {compile, I}} -&amp;gt;
case lists:keysearch(Tag, 1, I) of
{value, {Tag, Val}} -&amp;gt; {ok,Val};
false -&amp;gt; error
end;
false -&amp;gt; error
end.
</pre>
<pre class="brush: bash; title: ; notranslate">
#erl -nostick
Erlang R13B01 (erts-5.7.2) 1[/source] [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.2  (abort with ^G)
1&amp;gt; mnesia:start().  %启动我们的应用程序
ok
2&amp;gt; hi:do().
[{ok,io},
{ok,erl_distribution},
{ok,edlin},
{ok,error_handler},
{ok,io_lib},
{ok,hi},
{ok,filename},
{ok,orddict},
{ok,gb_sets},
{ok,inet_db},
{ok,inet},
{ok,ordsets},
{ok,group},
{ok,gen},
{ok,erl_scan},
{ok,kernel},
{ok,erl_eval},
{ok,ets},
{ok,lists},
{ok,sets},
{ok,inet_udp},
{ok,code},
{ok,ram_file},
{ok,dict},
{ok,packages},
{ok,gen_event},
{ok,heart},
{ok,...},
{...}|...]

3&amp;gt; m(dict).
Module dict compiled: Date: August 23 2009, Time: 17.20
Compiler options:  [{cwd,&quot;/home/yufeng/otp_src_R13B01/lib/stdlib/src&quot;},
{outdir,&quot;/home/yufeng/otp_src_R13B01/lib/stdlib/src/../ebin&quot;},
{i,&quot;/home/yufeng/otp_src_R13B01/lib/stdlib/src/../include&quot;},
{i,&quot;/home/yufeng/otp_src_R13B01/lib/stdlib/src/../../kernel/include&quot;},
debug_info,&lt;span style=&quot;color: red;&quot;&gt;native,&quot;{hipe, [o3]}&quot;&lt;/span&gt;]
Object file: /home/yufeng/otp_src_R13B01/lib/stdlib/src/../ebin/dict.beam
</pre>
<p>。。。</p>
<p>看到了是用native模式编译的哦。。。</p>
<p>不过编译过程中有几个模块是有点问题， 得改进下。</p>
<div style="margin-top: 0; margin-bottom: 15px; color: #888888; font-size: 80%; font-style: italic">
<p>Post Footer automatically generated by <a href="http://easwy.com/blog/wordpress/wp-posturl/" style="color: #8888FF; text-decoration: underline;">wp-posturl plugin</a> for wordpress.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.yufeng.info/archives/9/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

