Specialization (Static branch prediction and annotation)
新城@筑波大学情報です。こんにちは。
In article <m3oew4562s.fsf@maedapc.cc.tsukuba.ac.jp>
MAEDA Atusi <maeda@cc.tsukuba.ac.jp> writes:
> > 実はおんなじ引数で呼ぶってのがたくさんあるからinlineにしたい
> > わけなので、それらが共用される可能性があるからspecialization
> > の方が優れていると思います。(subroutine のoverhead が小さければ...)
> 「おんなじ引数で呼ぶってのがたくさんある」というのは良く分からないなあ.
> それも静的にですよね.そんなことがそれほどあるのかしらん.
私の感じだと、(静的に) specialization かけられるプログラムと
いうのは、ゴロゴロしていると思っています。たとえば、こんな感
じのプログラムは、よく見ませんか。
------------------------------------------------------------
f()
{
for( x=0; x<10; x++ )
{
g( x,y,10 );
}
}
g( x,y,z )
{
if( z >= 10 )
{
h( x, y );
}
else
{
i( x, y );
}
}
------------------------------------------------------------
ループの中で変らない変数を引数で渡したりします。10 などの定
数があからさまに出てくることもあるだろうし、x とか y と書い
てあっても、実は定数というのもあるでしょう。10 で
specialization かけるとこうなります。
------------------------------------------------------------
f()
{
for(...)
{
g_10( x,y );
}
}
g_10( x,y )
{
h( x, y );
}
------------------------------------------------------------
こうすると、インライン展開は別にやらなくても、g_10() の中で
if文外したり、計算を進めたりできるわけです。まあ、関数呼出し
のインライン展開も、分類上は、specialization の一種ではある
んですけれど。
さらに、x でループの展開もできます。
> 「polymorphicな関数を型についてspecializeする」とかなら価値はあると思
> うけど.
C++のテンプレートの展開以外にも、上のようなコードは、けっ
こうあります。あと、実行時にしか型がわからなくても、実行時
specialization というのもあります。実行時にコード生成します。
型ごとと言わず、オブジェクトごとにコード生成してもいい場合も
あるでしょう。
たぶん、今までは人間が specialization をしていたんだと思いま
す。これからは、コンパイラに任せる部分を増やしていこうという
方向でいいんだと思います。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735