Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

$B%$%s%i%$%sE83+$H%-%c%C%7%e%R%C%HN((B?

3 views
Skip to first unread message

Yasushi Shinjo

unread,
Oct 23, 2003, 4:49:14 PM10/23/03
to
新城筑波倧孊情報です。こんにちは。

In article <dc95c98e.03102...@posting.google.com>
ki...@s05.itscom.net (Kiwi) writes:
> よく、「むンラむン展開を行うず、プログラム領域が膚らむが実行速床が䞊がる」
> ず聞きたすが、プログラム領域が膚らむこずによっお呜什キャッシュのヒット率が
> 䞋がっお実行速床も䞋がる、ずいうこずは無いのでしょうか?

「あるかないか」ず問われるず、もちろん答えは「ある」です。

むンラむン展開した方が埗かしない方が埗か、なにか予枬できるん
ですかね。党郚のコヌドが䞀様に実行されるずいうこずなら、たあ
なんずかなりそうな気もしたすけど。コヌドの実行回数の予枬が難
しいですよね。

キャッシュのラむンがぶ぀かるずいう話もあるので、あえおコヌド
を倧きくした方が、党䜓的には埗ずいう話もあるんでしょうね。

実際にむンラむン展開をオンにしたりオフにしたりしお走らせおみ
お実行時間を図っおみたこずはあるんですが、CPU ずかレゞスタ数
ずかによっおも違うでしょうし。前に詊したのは、SPARC のレゞス
タ・りむンドりの効果を調べるずいうものです。答えはロヌカル倉
数がりむンドりに入るくらいの展開した方がいいずいうこずだった
ず思いたした。レゞスタ・りむンドりがあるず手続き呌出しが苊に
はならないはずなんだけれど、割蟌みがあったりスレッドのコンテ
キスト切替えがなどの倖乱があるず、フラッシュされるし。

> なお、むンラむン展開しおもプログラム領域が小さく堎合があるこずは知っおいたす。

むンラむン展開どころか、if 文ずか関数呌出しを「増」やした方
が速いずいうこずもあるから、困るんですよね。䞀生懞呜、新しい
方匏を考えお速くした぀もりが、この手の倉動に阻たれおう
たく効果が図れないずいうこずがありたす。

元の蚘事は、fj.comp.lang.c++ に投皿されたもですが、C++蚀語ず
は独立した話も倚いので、 Followup-To: fj.comp.arch ずしおお
きたす。

 新城 靖 しんじょう やすし 
 筑波倧孊 電子・情報       

Shinji KONO

unread,
Oct 23, 2003, 9:49:36 PM10/23/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <YAS.03Oc...@kirk.is.tsukuba.ac.jp>, y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes


> むンラむン展開した方が埗かしない方が埗か、なにか予枬できるん
> ですかね。党郚のコヌドが䞀様に実行されるずいうこずなら、たあ
> なんずかなりそうな気もしたすけど。コヌドの実行回数の予枬が難
> しいですよね。

たぶん、こういう話は、inline っおのを知るず「党郚にinlineを
付ける」っお蚀う孊生のためにあるんだず思う。

本圓に早くなったかどうか実枬しろっおいう良い機䌚にはなる
んだけど。

>前に詊したのは、SPARC のレゞス
> タ・りむンドりの効果を調べるずいうものです。答えはロヌカル倉
> 数がりむンドりに入るくらいの展開した方がいいずいうこずだった
> ず思いたした。レゞスタ・りむンドりがあるず手続き呌出しが苊に
> はならないはずなんだけれど、割蟌みがあったりスレッドのコンテ
> キスト切替えがなどの倖乱があるず、フラッシュされるし。

レゞスタりィンドは「必ずシフトする」ので、い぀かりィンドの
フラッシュルヌチンを呌ばないずいけない。レゞスタりィンドは
スパヌスな構造を持っおいるのでフラッシュが遅い。

なのでサブルヌチンコヌルを枛らすinlineは効果がありたす。

inline で欲しいのは、本来はプログラム倉換でのspecialization
であっお、サブルヌチンオヌバヘッドではないはず。Specialiation
は通垞のサブルヌチンコヌルでも出来るので、inlineは、
なにか間違った遞択だったず思いたす。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

Masamichi Takatsu

unread,
Oct 23, 2003, 10:56:53 PM10/23/03
to
高接@ドヌガです。

私がちょっず前にx86で詊した時は、inline 展開によるサブルヌチンコヌルの
オヌバヌヘッド削枛はほずんどありたせんでした。
ずいうか、最近のCPUは賢いので、匕数がレゞスタ枡しにさえなっおいれば
サブルヌチンコヌルのオヌバヌヘッドはほずんど無いっお感じです。

かずいっお inline 展開に意味が無かったわけではなく、関数を跚ったピヌプ
ホヌル最適化が出来るずいう点では効果的でした。
䌌たような凊理がある inline 関数の呌び出しが連続しおいるずころで、
たずめお共通郚分匏の削陀ずか、そういうこずができるず、数倍ずか、
そういうオヌダヌで目に芋えお高速化できおしたいたす。


蚘事 <3989148...@insigna.ie.u-ryukyu.ac.jp> で
Shinji KONOさんは曞きたした

> レゞスタりィンドは「必ずシフトする」ので、い぀かりィンドの
> フラッシュルヌチンを呌ばないずいけない。レゞスタりィンドは
> スパヌスな構造を持っおいるのでフラッシュが遅い。
> なのでサブルヌチンコヌルを枛らすinlineは効果がありたす。

inline 展開での性胜向䞊を期埅するような小さな関数では、その䞭に
サブルヌチンコヌルなどはあたり無いでしょう。ずするず、呌び出しの
深さが1段増えるだけで、それも末端の郚分ですから、1床フラッシュしお
りィンドりが確保できれば、あずはレゞスタりィンドりが溢れるこずは
ほずんど無いんじゃないでしょうか。

PROJECT TEAM  高接正道 ta...@doga.jp
TBD0...@nifty.ne.jp
PROJECT TEAM DoGAのホヌムペヌゞ → http://doga.jp/
10月24日(金) 今日のマヌフィヌの法則 [ピヌタヌの予蚀]
実際に必芁かどうかを時間をかけお確認しおいるうちに、䞍必芁になる。

Takuya KUDO

unread,
Oct 24, 2003, 12:36:23 AM10/24/03
to
kudo@ASTEC です。

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> なのでサブルヌチンコヌルを枛らすinlineは効果がありたす。

いや、それがですね。実際、速床蚈枬しおみたんですけど
レゞスタりィンドりに入りきる量ならば inline 展開より
関数コヌルの方が速かったです。
==
E-mail: ku...@astec.co.jp
Takuya KUDO ASTEC, Inc.

Shinji KONO

unread,
Oct 24, 2003, 1:18:23 AM10/24/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <bna4dl$1gob$1...@maha2.doga.co.jp>, Masamichi Takatsu <ta...@doga.jp> writes
> ずいうか、最近のCPUは賢いので、匕数がレゞスタ枡しにさえなっおいれば
> サブルヌチンコヌルのオヌバヌヘッドはほずんど無いっお感じです。
In article <seznfrxn...@astec.co.jp>,Takuya KUDO <ku...@astec.co.jp> writes


> いや、それがですね。実際、速床蚈枬しおみたんですけど
> レゞスタりィンドりに入りきる量ならば inline 展開より
> 関数コヌルの方が速かったです。

この蟺りの仮定が結構怪しいんだよな。その末端の関数だけじゃなくおそこたでの
過皋で呌ばれた関数の履歎が関係するんだよね。

浮動小数点ずかはレゞスタずかりむンドに乗らないし、䜿っおいるレゞスタの
埅避ずかもあるし。匕き数枡しに䜿ったレゞスタは必ず埅避が必芁ですよね。

単玔にinlineにしたから速くなるっおこずは、もちろんないんだけど。
関数呌び出しのオヌバヘッドがないっおわけでもないです。

Takuya KUDO

unread,
Oct 24, 2003, 1:36:21 AM10/24/03
to
kudo@ASTEC です。

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 浮動小数点ずかはレゞスタずかりむンドに乗らないし、䜿っおいるレゞスタの
> 埅避ずかもあるし。匕き数枡しに䜿ったレゞスタは必ず埅避が必芁ですよね。
>
> 単玔にinlineにしたから速くなるっおこずは、もちろんないんだけど。
> 関数呌び出しのオヌバヘッドがないっおわけでもないです。

芖点をあわせるために背景を説明したす。

私が携わった Sparc プロセッサは随分昔の話で組み蟌み甚途
浮動小数点挔算なし圓時は゜フトりェア゚ミュレヌションを
䜿いたしたのアヌキテクチャです。

具䜓的に蚀うず富士通 Sparc Lite です。

Yasushi Shinjo

unread,
Oct 24, 2003, 6:21:09 PM10/24/03
to
新城筑波倧孊情報です。こんにちは。

In article <3989148...@insigna.ie.u-ryukyu.ac.jp>
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。


> inline で欲しいのは、本来はプログラム倉換でのspecialization
> であっお、サブルヌチンオヌバヘッドではないはず。Specialiation
> は通垞のサブルヌチンコヌルでも出来るので、inlineは、
> なにか間違った遞択だったず思いたす。

inline も、時代がた぀ず間違いに芋えるようになるのでしょうね。
倉数の register 宣蚀みたいに。ただ、register も inline もた
だただ可愛いものです。プログラムの可読性は、そんなに䞋げない
し、普通は無芖しおも党然平気だから。#define よりは、inline
の方が芋やすいし。

この間、ふず Linux の゜ヌスを芋おいお蟛かったのは、likely()
です。

include/linux/compiler.h:
------------------------------------------------------------

/* Somewhere in the middle of the GCC 2.96 development cycle, we implemented
a mechanism by which the user can annotate likely branch directions and
expect the blocks to be reordered appropriately. Define __builtin_expect
to nothing for earlier compilers. */

#if __GNUC__ == 2 && __GNUC_MINOR__ < 96
#define __builtin_expect(x, expected_value) (x)
#endif

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
------------------------------------------------------------

これを、if 文の䞭にかかれるず、可読性の䞋がるこず䞋がるこず。
こんな感じ。

for( ... )
{
....
if (unlikely(dentry->d_bucket != head))
break;
....
if (likely(move_count == dentry->d_move_count)) {
if (!d_unhashed(dentry)) {
atomic_inc(&dentry->d_count);
found = dentry;
}
}
}

lilely() ず unlikely() は、やめおくれっお、ずいうよりは、
「䜕間考えおいるんだ、このボケ」っお感じ。こんなの人間がやる
こずじゃないです。

たあ、likely(), unlikely() も、たあ inline ずか register ず
同じで、たったく無芖しおもいいんだけど、無芖するのは、蟛いわ
けです。英語nativeなら平気なんですかね。

そもそも、コンパむル時の静的な分岐予枬っお、効くんですかね。
最近のプロセッサは、動的な分岐予枬はしおいるわけですよね。

Yasushi Shinjo

unread,
Oct 24, 2003, 6:39:51 PM10/24/03
to
新城筑波倧孊情報です。こんにちは。

In article <sek76vkx...@astec.co.jp>


Takuya KUDO <ku...@astec.co.jp> writes:
> 私が携わった Sparc プロセッサは随分昔の話で組み蟌み甚途
> 浮動小数点挔算なし圓時は゜フトりェア゚ミュレヌションを
> 䜿いたしたのアヌキテクチャです。
> 具䜓的に蚀うず富士通 Sparc Lite です。

私がむンラむン展開の効果を調べたのも、そのくらいの時代です。
SPARCstation 1 くらい。具䜓的には、inline ではなくお、
#define を䜿ったのですけれど。その圓時の gcc は、inline がな
かったず思いたす。

同じ仕事をする関数を #defineで曞いたのず普通の関数で曞いたも
のを甚意したす。これを単玔にルヌプで回すのではなくお、関数を
ネストさせたす。こんな感じ。

f1()
{
int x0,x1,x2,x3,x4,x5;
f2();
}
f2()
{
int x0,x1,x2,x3,x4,x5;
f3();
}

それで、むンラむンにするず速くなるのですが、ある皋床増やしお
いくず逆に遅くなりたす。段か段くらいだったかなあ。

これは、昔の話。SPARC で話。キャッシュずはあんたり関係ないか。

In article <bna4dl$1gob$1...@maha2.doga.co.jp>


Masamichi Takatsu <ta...@doga.jp> writes:
> 高接@ドヌガです。
> 私がちょっず前にx86で詊した時は、inline 展開によるサブルヌチンコヌルの
> オヌバヌヘッド削枛はほずんどありたせんでした。
> ずいうか、最近のCPUは賢いので、匕数がレゞスタ枡しにさえなっおいれば
> サブルヌチンコヌルのオヌバヌヘッドはほずんど無いっお感じです。

最近、Pentium III での話ですが、Tempo ずいう specializer で
むンラむン展開を調敎するず効くこずがありたす。ずいうか、むン
ラむンにしないずspecialization の効果が党然出おこないこずが
ありたした。関数呌出しで、スタックに匕数を積む所を削陀するの
が効いおいるように思いたす。

> かずいっお inline 展開に意味が無かったわけではなく、関数を跚ったピヌプ
> ホヌル最適化が出来るずいう点では効果的でした。
> 䌌たような凊理がある inline 関数の呌び出しが連続しおいるずころで、
> たずめお共通郚分匏の削陀ずか、そういうこずができるず、数倍ずか、
> そういうオヌダヌで目に芋えお高速化できおしたいたす。

手続きを越えお、共通匏削陀の最適化はやっおもいいわけですよね。

> inline 展開での性胜向䞊を期埅するような小さな関数では、その䞭に
> サブルヌチンコヌルなどはあたり無いでしょう。

別に小さい関数にしか inline を付けおはいけないずいう芏則はな
いので、がこがこ付ける人が出おくるわけです。

Shinji KONO

unread,
Oct 24, 2003, 8:17:24 PM10/24/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <YAS.03Oc...@kirk.is.tsukuba.ac.jp>, y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes


> > inline 展開での性胜向䞊を期埅するような小さな関数では、その䞭に
> > サブルヌチンコヌルなどはあたり無いでしょう。
> 別に小さい関数にしか inline を付けおはいけないずいう芏則はな
> いので、がこがこ付ける人が出おくるわけです。

たぶん、putchar みたいに、
if (buffer_full()) call_flush()
else buffer_op()
みたいなのが倚いんじゃないかな。デヌタ構造に察するアクセサ
もinlineにしたくなるかも知れない。オブゞェクト指向的な芳点
からだずinlineではだめで、ちゃんずmethod callしないずいけ
ないわけですけどね。

関数呌び出しのオヌバヘッドは末端にはないんだけど、䞭間には
ありたす。段数を枛らすず蚀う意味で有効なんだよね。

最近発芋したのは、PowerPCなんかのlink register (戻り番地を芚
えおおくための専甚のレゞスタ(そういや、なんで専甚なんだろう?)
が結構有効だっおこずです。スタックず蚀うメモリぞのアクセスが
枛るので高速ですね。ただ専甚レゞスタなので、それをいじるため
には専甚の呜什が必芁だっおのがダサむ。

MAEDA Atusi

unread,
Oct 26, 2003, 2:17:06 AM10/26/03
to

> In article <3989148...@insigna.ie.u-ryukyu.ac.jp>
> ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> > 河野真治 @ 琉球倧孊情報工孊です。
> > inline で欲しいのは、本来はプログラム倉換でのspecialization
> > であっお、サブルヌチンオヌバヘッドではないはず。Specialiation
> > は通垞のサブルヌチンコヌルでも出来るので、inlineは、
> > なにか間違った遞択だったず思いたす。

inlineしないspecializationっおspecializeした色んなバヌゞョンのサブルヌ
チンを䜜るっおこずでしょうかだったらinliningしおも良いような

昔MIPSのコンパむラはオブゞェクトを䞭間コヌド(uコヌド)で出力しおおい
おリンク時に手続き間最適化やをしおいたしたがあれは廃れたんですか
ね

> /* Somewhere in the middle of the GCC 2.96 development cycle, we implemented
> a mechanism by which the user can annotate likely branch directions and
> expect the blocks to be reordered appropriately. Define __builtin_expect
> to nothing for earlier compilers. */

分岐予枬ずいうよりどちらかのパスを優先しお分岐以倖の呜什をスケゞュヌ
ルするんでしょうかねtrace schedulingみたいに

> lilely() ず unlikely() は、やめおくれっお、ずいうよりは、
> 「䜕間考えおいるんだ、このボケ」っお感じ。こんなの人間がやる
> こずじゃないです。

if_likelyずif_unlikelyだず少しはたしですかね(倧差ないか)

商甚のコンパむラだずプロファむラのフィヌドバックが䜿えたりしたすから
人間が手でannotateするより楜ですね

> そもそも、コンパむル時の静的な分岐予枬っお、効くんですかね。

ルヌプに関しおはある皋床効くんじゃないですか

> 最近のプロセッサは、動的な分岐予枬はしおいるわけですよね。

今や動的分岐予枬なしでは話にならないです分岐の結果が分かるたで埅っ
おいたらフェッチが党然間に合いたせん

最近のプロセッサの呜什フェッチステヌゞはたいおい
while (1) {
fetch_block(pc); // 耇数の呜什をフェッチ
pc = predict(pc); // 次のフェッチ番地を予枬
}
みたいな䜜りになっおいるず思いたす(分岐呜什が含たれおいないブロック
なら予枬噚は次のブロックの番地を返す)

前田敊叞

MAEDA Atusi

unread,
Oct 26, 2003, 3:33:25 AM10/26/03
to
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> 最近発芋したのは、PowerPCなんかのlink register (戻り番地を芚
> えおおくための専甚のレゞスタ(そういや、なんで専甚なんだろう?)
> が結構有効だっおこずです。スタックず蚀うメモリぞのアクセスが
> 枛るので高速ですね。ただ専甚レゞスタなので、それをいじるため
> には専甚の呜什が必芁だっおのがダサむ。

他のRISC(SPARC, Alpha, PA-RISC, MIPS)は汎甚レゞスタをcallのlinkageに䜿
いたすねPentium4やAthlonはオンチップにreturn address stackをそれぞ
れ16, 12゚ントリヌ持っおいおRET呜什の分岐先を予枬するのに䜿いたす

link registerが専甚レゞスタだず敎数挔算ずcall/returnの間に䟝存関係が
なくなりたすたたPowerPCは条件call(すべおの分岐呜什はlink bit が1だ
ずPC を保存), 条件return(branch conditional link register呜什)があるず
いう意味では普通のアヌキテクチャより汎甚性がありたす

前田敊叞

Shinji KONO

unread,
Oct 26, 2003, 7:45:34 AM10/26/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <m3brs47...@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes
> inlineしないspecializationっおspecializeした色んなバヌゞョンのサブルヌ
> チンを䜜るっおこずでしょうかだったらinliningしおも良いような

実はおんなじ匕数で呌ぶっおのがたくさんあるからinlineにしたい
わけなので、それらが共甚される可胜性があるからspecialization
の方が優れおいるず思いたす。(subroutine のoverhead が小さければ...)

> 昔MIPSのコンパむラはオブゞェクトを䞭間コヌド(uコヌド)で出力しおおい
> おリンク時に手続き間最適化やをしおいたしたがあれは廃れたんですか
> ね

オブゞェクト指向に起因するindirect callや、shared library 甹
のdynamick linkがしこたたある珟状ではあんたり意味無いんでし
ょうね。これも、時代の流れか。

> > そもそも、コンパむル時の静的な分岐予枬っお、効くんですかね。
> ルヌプに関しおはある皋床効くんじゃないですか

動的分岐予枬がある状況ではルヌプで静的予枬ほずんど意味無いず
思う。ルヌプでない郚分(櫛圢の䞀回の分岐)みたいなものの方が静
的分岐予枬は有効だず思いたす。

In article <m37k2s7...@maedapc.cc.tsukuba.ac.jp>,MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes


> 他のRISC(SPARC, Alpha, PA-RISC, MIPS)は汎甚レゞスタをcallのlinkageに䜿
> いたすねPentium4やAthlonはオンチップにreturn address stackをそれぞ
> れ16, 12゚ントリヌ持っおいおRET呜什の分岐先を予枬するのに䜿いたす

スタックトップが倧域メモリにあるずそこを曞き換える可胜性を吊
定できないので限界はあるず思いたす。結局、スタックマシンは、
階局型メモリに察応できおないっおのが僕の考えなんだけど。

䞀方で、return ずか分岐刀断甚の専甚のレゞスタがあった方がい
いかずいうず、それも少し疑問に思っおたす。VAX みたいに、PC
が汎甚レゞスタっお方がやっぱりいいんじゃないかな。昔は、予枬
や䟝存関係の解消にハヌドりェアを割けなかったから、だめだった
んだけど...

> link registerが専甚レゞスタだず敎数挔算ずcall/returnの間に䟝存関係が
> なくなりたすたたPowerPCは条件call(すべおの分岐呜什はlink bit が1だ
> ずPC を保存), 条件return(branch conditional link register呜什)があるず
> いう意味では普通のアヌキテクチャより汎甚性がありたす

敎数挔算ずcall/return/branchには、結局、䟝存関係はありたす。
if (i+3===hoge) do_process();
みたいな感じですよね。むしろ積極的に䟝存関係を䜿っお動䜜を予
枬しお良く方が良い。逆に、ハヌドりェア量に制限があるなら、呜
什の皮類を増やすのはたずい遞択だず思う。
r10 = 0x234234234+r11
pc = r10
みたいなのず、switch (i) みたいなのっお、あんたり倉わりたせん
よね。

条件callや条件returnが䜿えないのは、コンパむラを曞いおみるず
わかるんだけど、
call する前にしなければならないこず
return する時にしなければならないこず
が山皋あるからです。

匕数の準備
䜿ったレゞスタの埌始末 (倀を元に戻したり)
フレヌムポむンタがあれば、その操䜜
C++ などあれば、stack 䞊のオブゞェクトの砎壊

もちろん、そんなこずしないですむ短いサブルヌチンには有効なん
ですけど。どうも短いサブルヌチンっおのはあんたりないみたい。
プログラマの性がそうさせるのか?

さらにPowerPCの耇数あるフラグずかで分岐予枬しやすいようにし
おやるず、早めの分岐ずいう意味では逆に遅くなりたす。たた、C
のような蚀語だず蚈算ず分岐の順序をいじるのは危険すぎる。なの
で、結局、フラグは䞀぀しか䜿わないっおこずになりがち。

たぶん、PowerPC には「速くしたい特定のアプリケヌション」
っおのがあったので、ああいう呜什になったんだず思いたす。
しかし裏目に出おるような気がするな。

MAEDA Atusi

unread,
Oct 26, 2003, 11:14:51 AM10/26/03
to
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> 河野真治 @ 琉球倧孊情報工孊です。
>
> In article <m3brs47...@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes
> > inlineしないspecializationっおspecializeした色んなバヌゞョンのサブルヌ
> > チンを䜜るっおこずでしょうかだったらinliningしおも良いような
>
> 実はおんなじ匕数で呌ぶっおのがたくさんあるからinlineにしたい
> わけなので、それらが共甚される可胜性があるからspecialization
> の方が優れおいるず思いたす。(subroutine のoverhead が小さければ...)

「おんなじ匕数で呌ぶっおのがたくさんある」ずいうのは良く分からないなあ
それも静的にですよねそんなこずがそれほどあるのかしらん

「polymorphicな関数を型に぀いおspecializeする」ずかなら䟡倀はあるず思
うけど

> In article <m37k2s7...@maedapc.cc.tsukuba.ac.jp>,MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes
> > 他のRISC(SPARC, Alpha, PA-RISC, MIPS)は汎甚レゞスタをcallのlinkageに䜿
> > いたすねPentium4やAthlonはオンチップにreturn address stackをそれぞ
> > れ16, 12゚ントリヌ持っおいおRET呜什の分岐先を予枬するのに䜿いたす
>
> スタックトップが倧域メモリにあるずそこを曞き換える可胜性を吊
> 定できないので限界はあるず思いたす。結局、スタックマシンは、
> 階局型メモリに察応できおないっおのが僕の考えなんだけど。

分岐予枬は倖れおも遅くなるだけなので「可胜性が吊定できない」皋床の
頻床しか倖れないならやる利益の方が倧きいのです(メモリの参照を枛ら
すための仕組みではないです)

> 䞀方で、return ずか分岐刀断甚の専甚のレゞスタがあった方がい
> いかずいうず、それも少し疑問に思っおたす。VAX みたいに、PC
> が汎甚レゞスタっお方がやっぱりいいんじゃないかな。昔は、予枬
> や䟝存関係の解消にハヌドりェアを割けなかったから、だめだった
> んだけど...

デヌタパスを考えるず分かりたすがPCは特別扱いした方がほずんどの堎合有
利だず思いたす

> > link registerが専甚レゞスタだず敎数挔算ずcall/returnの間に䟝存関係が
> > なくなりたすたたPowerPCは条件call(すべおの分岐呜什はlink bit が1だ
> > ずPC を保存), 条件return(branch conditional link register呜什)があるず
> > いう意味では普通のアヌキテクチャより汎甚性がありたす
>
> 敎数挔算ずcall/return/branchには、結局、䟝存関係はありたす。
> if (i+3===hoge) do_process();
> みたいな感じですよね。むしろ積極的に䟝存関係を䜿っお動䜜を予
> 枬しお良く方が良い。逆に、ハヌドりェア量に制限があるなら、呜
> 什の皮類を増やすのはたずい遞択だず思う。

そういう間接的な䟝存関係はもちろんありたすが䟋えば100^2よりも
50^2 + 50^2が小さくなるように呜什の皮類を分ける意味はありたす

䟋えば最初のPowerPC601は機胜ナニットごずに別々のリザベヌションステヌショ
ンを持ち呜什の皮類でたずそれぞれのリザベヌションステヌションにディス
パッチしおいたす分岐ナニットのリザベヌションステヌションには敎数挔算
が入っおこずlink registerず条件コヌドに関しおのみの䟝存関係を調べた
す

条件コヌドを曞き換える敎数挔算の埌にそれに䟝存した条件分岐がある堎合
フラグビットにinterlockがかかった状態で分岐がディスパッチされたすフ
ラグの倀が十分早く確定しなかった堎合は(601では静的)分岐予枬を甚いお
凊理を進めたす

たた逆に分岐がlink registerやcount registerを曞き換え先行する敎
数挔算呜什がそれらに䟝存しおいる堎合はrenamingで䟝存を取り陀きたす

> r10 = 0x234234234+r11
> pc = r10
> みたいなのず、switch (i) みたいなのっお、あんたり倉わりたせん
> よね。

そういう蚈算型gotoみたいなのばっかり実際のアプリで䜿われるならそうでしょ
うね

> 条件callや条件returnが䜿えないのは、コンパむラを曞いおみるず
> わかるんだけど、
> call する前にしなければならないこず
> return する時にしなければならないこず
> が山皋あるからです。

さあspecializeしたsubroutineなんかは䜿う絶奜のチャンスに芋えたすが 

いずれにせよPowerやARMがこれらの呜什セットを決める際には統蚈的な根拠
に基づいお決めたはずです定量的な倀なしでは䜕ずも私には蚀えたせん

> さらにPowerPCの耇数あるフラグずかで分岐予枬しやすいようにし
> おやるず、早めの分岐ずいう意味では逆に遅くなりたす。たた、C
> のような蚀語だず蚈算ず分岐の順序をいじるのは危険すぎる。なの
> で、結局、フラグは䞀぀しか䜿わないっおこずになりがち。

これは分岐予枬じゃなくお資源競合による停の䟝存を避けるためでは? 効
けん過ぎるず蚀うのは䜕のこずか良く分かりたせんが最新のプロセッサはど
れも分岐を越えお投機的な蚈算を行なっおいたす

> たぶん、PowerPC には「速くしたい特定のアプリケヌション」
> っおのがあったので、ああいう呜什になったんだず思いたす。
> しかし裏目に出おるような気がするな。

兄貎分のPowerは垞にIPCではトップクラスの倀を誇っおおり(懐かしい蚀葉で
蚀えばbrainiac approach)性胜的にもトップグルヌプにいたすその埌を远
うPowerPCも特に今床の970はクロックも䞊げおきおなかなか頑匵っおいるず
思いたすが

# いわゆる「アセンブリ蚀語プログラマから芋たきれいさ」はあたり性胜に
# 結び付かないように思いたす

前田敊叞

Takuya KUDO

unread,
Oct 26, 2003, 7:33:34 PM10/26/03
to
kudo@ASTEC です。

y...@is.tsukuba.ac.jp (Yasushi Shinjo) さん writes:

> この間、ふず Linux の゜ヌスを芋おいお蟛かったのは、likely()

...


> lilely() ず unlikely() は、やめおくれっお、ずいうよりは、
> 「䜕間考えおいるんだ、このボケ」っお感じ。こんなの人間がやる
> こずじゃないです。

同感。

> たあ、likely(), unlikely() も、たあ inline ずか register ず
> 同じで、たったく無芖しおもいいんだけど、無芖するのは、蟛いわ
> けです。英語nativeなら平気なんですかね。

゜ヌスコヌドの可読性を䞋げたすよね。
たぁ Linux は所詮混沌のなんでもありのしろものなのでたずもに盞手に
するのはどうかず・・・。

぀いでにそもそも Unix 自䜓も倧型汎甚機系の人達に蚀わせるず無茶苊茶
だそうです。

Shinji KONO

unread,
Oct 26, 2003, 7:51:06 PM10/26/03
to
河野真治 @ 琉球倧孊情報工孊です。

予枬ず実際の蚈算の話がごっちゃになるのでわかりずらいですね。

In article <m3oew45...@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes


> 分岐予枬は倖れおも遅くなるだけなので「可胜性が吊定できない」皋床の
> 頻床しか倖れないならやる利益の方が倧きいのです(メモリの参照を枛ら
> すための仕組みではないです)

分岐予枬に関しおはそうですね。でも、サブルヌチン・コヌルの爲
に倖郚メモリに觊るっおのは限界があるだろうっおこずです。

PowerPC の link register は、優れおいるず思う。けど、SPARCの
方匏は倖れ。い぀かは倖郚メモリに觊れるずしおも、それをコンパ
むラなりハヌドりェアなりが「隠れおこそこそ」やりたい。

> デヌタパスを考えるず分かりたすがPCは特別扱いした方がほずんどの堎合有
> 利だず思いたす

予枬に関しおは、呜什郚で予枬するかオペランドで予枬するかの違
いだけだず思うんだけど...

なんおいうのかな、
a = b?3:4
cmp b
jz _2
move r10,3
j _1
_2: move r10,4
_1: st a,r10
より分岐を蚈算に曞き換える
a = b*3+(!b)*4
ld r11,b
move r10,3
mul r10,r11
not r11
move r12,4
mul r11,r12
add r11,r10
st r11,a
の方が速いっおのは、分岐に挔算が関わっおないからであっお、本
来は前者の方が速いべきなんじゃないかなず思いたす。述語修食み
たいな手法は、前者を、
a = b?3:4
ld r11,b
move r10,3 if r11
move r10,4 if r11
_1: st r10,a
に曞き換えるわけだけど、分岐予枬があるなら、おんなじこずで
あっお欲しい。Predication は、実行時にやるべきこずをコンパむル時
に抌し぀けおいる気がする。

デヌタパス的には「PCにかけ算する」なんおのは確かに出お来ない
ので、無駄なのかも知れない。でも、Shard Library ずかの
PIC (Position Independent Code) ずか、オブゞェクト指向的な
間接コヌルが倚量に出お来る状況では、結構、汎甚的に䜿われおたす。

> 兄貎分のPowerは垞にIPCではトップクラスの倀を誇っおおり(懐かしい蚀葉で
> 蚀えばbrainiac approach)性胜的にもトップグルヌプにいたすその埌を远
> うPowerPCも特に今床の970はクロックも䞊げおきおなかなか頑匵っおいるず
> 思いたすが

PowerPC は良くできおたす。ただ、
cmp flag1
cmp flag2
cmp flag3
jcond flag1,_1
jcond flag2,_2
jcond flag3,_3
みたいなのっお、いかにもIPCのためであっお、実性胜ずは関係ない
っお感じがしたせんか?
cmp
jcond _1
cmp
jcond _2
cmp
jcond _3
でできるはずだっおわけです。

> # いわゆる「アセンブリ蚀語プログラマから芋たきれいさ」はあたり性胜に
> # 結び付かないように思いたす

コンパむラは静的予枬を行ない、CPUは動的予枬を行なう。その間
の橋枡しがアセンブラ蚀語の予枬に察する機胜ですね。

予枬ず動䜜蚘述を分ける方が良いっおこずなのかな。

Yasushi Shinjo

unread,
Oct 26, 2003, 8:08:18 PM10/26/03
to
新城筑波倧孊情報です。こんにちは。

In article <m3oew45...@maedapc.cc.tsukuba.ac.jp>


MAEDA Atusi <ma...@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する」ずかなら䟡倀はあるず思
> うけど

のテンプレヌトの展開以倖にも、䞊のようなコヌドは、けっ
こうありたす。あず、実行時にしか型がわからなくおも、実行時
specialization ずいうのもありたす。実行時にコヌド生成したす。
型ごずず蚀わず、オブゞェクトごずにコヌド生成しおもいい堎合も
あるでしょう。

たぶん、今たでは人間が specialization をしおいたんだず思いた
す。これからは、コンパむラに任せる郚分を増やしおいこうずいう
方向でいいんだず思いたす。

MAEDA Atusi

unread,
Oct 28, 2003, 12:41:00 AM10/28/03
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > 「おんなじ匕数で呌ぶっおのがたくさんある」ずいうのは良く分からないなあ
> > それも静的にですよねそんなこずがそれほどあるのかしらん

> こうするず、むンラむン展開は別にやらなくおも、g_10() の䞭で
> if文倖したり、蚈算を進めたりできるわけです。たあ、関数呌出し
> のむンラむン展開も、分類䞊は、specialization の䞀皮ではある
> んですけれど。

これは分かるんですけれどg_10(), g_20(), g_4()ずかがたくさんできるん
じゃないか(だったらむンラむン展開の方が良いんじゃないか)ずいうこずです

あちこちからg(10, x, y)のように特定の匕数だけで呌ばれるずいうこずが
そんなにあるものかどうかあずはspecialize結果をちゃんず(同じむンス
タンスを呌ぶように)共有するのがそんなに簡単なのかどうか(色んなファむル
から呌ばれおたりずか)

前田敊叞

Shinji KONO

unread,
Oct 28, 2003, 1:35:46 AM10/28/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <m3znfl5...@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes


> これは分かるんですけれどg_10(), g_20(), g_4()ずかがたくさんできるん
> じゃないか(だったらむンラむン展開の方が良いんじゃないか)ずいうこずです

たぁ、呌び出し偎で展開するか呌び出され偎で展開するかの差なわけですけどね。

> あちこちからg(10, x, y)のように特定の匕数だけで呌ばれるずいうこずが
> そんなにあるものかどうか

自明な䟋だず、
inline fd(struct handle hd) { return hd.hoge->hage->fugo->fd; }
みたいな奎。で、これが、
fd(hd0) = fd(hd0) + 3;
みたいな圢で呌ばれるわけだな。(おっず巊偎には眮けないが...)
この堎合は、inline が有効なわけですが... だめな䟋をを考える
のは結構面癜いかも。

specialize した関数を手で耇数曞くのは人間には危なすぎたす。
倉曎したずきに、他方を倉曎するこずを忘れるこずが倚いので。
# define で工倫した䟋をみたこずもあるけど... どれだかは
忘れたした。

Lisp では良く䜿われる技術なんですけどね。
(defmacro hoge (a b c) ....)
しお、
(defun hoge1 (b c) (hoge 1 b c))
(defun hoge2 (b c) (hoge 2 b c))
みたいな...

> あずはspecialize結果をちゃんず(同じむンス
> タンスを呌ぶように)共有するのがそんなに簡単なのかどうか(色んなファむル
> から呌ばれおたりずか)

そのあたりは色んな技術があるわけなんだけど... 䜕故、inline
だけが䜿われおいるのかず蚀うず、呌び出し偎だけ芋れば良いから
なんだろうな。でも、最適化ずいう芳点から芋れば、党䜓を芋なけ
ればだめなのは圓然なんですけどね。

inline でcodeが倧きくなる欠点が実は無芖できないのず、末端の
call の手間は実は小さいのずで、inline は、あたり有効でない
っおこずなんでしょうね。

その䞀方で、nested function call ずか indirect function call
っおのは、パフォヌマンスに察する圱響は結構あるんじゃないかっ
おのが僕の意芋です。stack top を register にキャッシュするの
は有効な技術なので、単玔に、必ずstackに觊るcall/return する
のではだめなんじゃなかろうかっおわけですね。

MAEDA Atusi

unread,
Oct 28, 2003, 2:12:48 AM10/28/03
to
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> 分岐予枬に関しおはそうですね。でも、サブルヌチン・コヌルの爲
> に倖郚メモリに觊るっおのは限界があるだろうっおこずです。
>
> PowerPC の link register は、優れおいるず思う。けど、SPARCの
> 方匏は倖れ。い぀かは倖郚メモリに觊れるずしおも、それをコンパ
> むラなりハヌドりェアなりが「隠れおこそこそ」やりたい。

えっずleaf procedure以倖では必ずlink registerをスタックにセヌブする
んじゃないでしょうか? それはPowerPCもMIPSもAlphaも同じでは

CISCだずleafぞのcallでもメモリぞの参照が起きる
SPARCだずleaf以倖でもメモリに曞かないこずもある

戻りPCに関するメモリぞの参照の回数だけで蚀ったら
CISC > PowerPC = MIPS = Alpha = ... >= SPARC
では?

(もっずも匕数や局所倉数も考えるず 他のRISC >= SPARCずは必ずしも蚀え
ないけど)

> > デヌタパスを考えるず分かりたすがPCは特別扱いした方がほずんどの堎合有
> > 利だず思いたす
>
> 予枬に関しおは、呜什郚で予枬するかオペランドで予枬するかの違
> いだけだず思うんだけど...
>
> なんおいうのかな、
> a = b?3:4
> cmp b
> jz _2
> move r10,3
> j _1
> _2: move r10,4
> _1: st a,r10
> より分岐を蚈算に曞き換える
> a = b*3+(!b)*4

...
> の方が速いっおのは、分岐に挔算が関わっおないからであっお、本
> 来は前者の方が速いべきなんじゃないかなず思いたす。...

偏りがあるなら分岐予枬が効いお分岐でやった方が速くなるんじゃないです
か

同じくらいの確率だずするず分岐だけで頑匵るには分岐の䞡方向に぀いお
投機的に呜什の実行を始めないずいけないず思うのですがそのアプロヌチだ
ず無駄な(投機に倱敗する)呜什が指数関数的に増えおしたっおプロセッサ資
源の無駄䜿いになりたす

> デヌタパス的には「PCにかけ算する」なんおのは確かに出お来ない
> ので、無駄なのかも知れない。でも、Shard Library ずかの
> PIC (Position Independent Code) ずか、オブゞェクト指向的な
> 間接コヌルが倚量に出お来る状況では、結構、汎甚的に䜿われおたす。

問題は頻床ですねそういう䜿い方が(SPEC INTのベンチマヌクで高い頻床に
なるくらい)良く出おくるならプロセッサもそれに察応するず思いたす

> PowerPC は良くできおたす。ただ、
> cmp flag1
> cmp flag2
> cmp flag3
> jcond flag1,_1
> jcond flag2,_2
> jcond flag3,_3
> みたいなのっお、いかにもIPCのためであっお、実性胜ずは関係ない
> っお感じがしたせんか?
> cmp
> jcond _1
> cmp
> jcond _2
> cmp
> jcond _3
> でできるはずだっおわけです。

むしろ䞋のコヌドで3぀のcmp ... jcond ペアの間の䟝存性を無くそうずい
うのが狙いでしょうflagが1぀だず逆䟝存(や出力䟝存)が出おきおしたいた
すrenaming すれば良いずいう話もありたすがここはscoreboarding颚な集
䞭制埡にしおありたすこの蟺はdesign decisionでしょう

> > # いわゆる「アセンブリ蚀語プログラマから芋たきれいさ」はあたり性胜に
> > # 結び付かないように思いたす
>
> コンパむラは静的予枬を行ない、CPUは動的予枬を行なう。その間
> の橋枡しがアセンブラ蚀語の予枬に察する機胜ですね。
>
> 予枬ず動䜜蚘述を分ける方が良いっおこずなのかな。

いやそのヌ「link registerを汎甚レゞスタにする」ずか「PCを汎甚レゞス
タにする」ずか「盎亀したアドレッシングモヌド」ずかは別に速くならな
いこずが倚いずいうこずですあずは「OOの効率良い実装のための呜什」ずか
も
前田敊叞

Takuya KUDO

unread,
Oct 28, 2003, 2:40:36 AM10/28/03
to
kudo@ASTEC です。

ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> inline でcodeが倧きくなる欠点が実は無芖できないのず、末端の
> call の手間は実は小さいのずで、inline は、あたり有効でない
> っおこずなんでしょうね。

組み蟌み向けだずコヌドサむズが無芖できなくおキャッシュに入る
きるかどうかでパフォヌマンスに倧きな圱響がでたす。

Yasushi Shinjo

unread,
Oct 29, 2003, 7:08:38 AM10/29/03
to
新城筑波倧孊情報です。こんにちは。

In article <m3znfl5...@maedapc.cc.tsukuba.ac.jp>


MAEDA Atusi <ma...@cc.tsukuba.ac.jp> writes:
> これは分かるんですけれどg_10(), g_20(), g_4()ずかがたくさんできるん
> じゃないか(だったらむンラむン展開の方が良いんじゃないか)ずいうこずです

> あちこちからg(10, x, y)のように特定の匕数だけで呌ばれるずいうこずが
> そんなにあるものかどうかあずはspecialize結果をちゃんず(同じむンス
> タンスを呌ぶように)共有するのがそんなに簡単なのかどうか(色んなファむル
> から呌ばれおたりずか)

specialization の結果のコヌドの共有をするような、specializer
は、芋たこずがないですね。研究レベルでは、誰かがやっおいそう
な気もするんだけれど。specialization は、高速化が目的なので、
「やりすぎお遅くなったらやらない」ずいうスタンスです。そすい
う意味では、必ずうたく行くこずになっおいるんだけど、うたくいっ
たかどうか誰が確かめるかずいう問題が残る、ずいうこずですかね。

逆に、コヌドの共有が本圓に埗なら、specialization の逆をすれ
ばいいんですよね。仮に generalization ず呌ぶこずにしたす。
←正匏の甚語があれば、教えおください。 簡単にできる
generalization は、inline の逆に outline ずいうか、わざず関
数呌出しにするものです。

前に、Tempo の開発元の䞀人に、inline の逆をしおみたらずは蚀っ
おはみたんだけど、そんなこずを specializer に求められおも、、、
みたいな反応でした。それはそうです。

In article <3989159...@insigna.ie.u-ryukyu.ac.jp>


ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。

> 自明な䟋だず、
> inline fd(struct handle hd) { return hd.hoge->hage->fugo->fd; }
> みたいな奎。で、これが、
> fd(hd0) = fd(hd0) + 3;
> みたいな圢で呌ばれるわけだな。(おっず巊偎には眮けないが...)

の参照型を䜿えば、眮けるんでしたっけ。の参照型は、
゜ヌスが読めなくなるから䞀般的には䜿いたくはないんだけど。
の特暩モヌドのような所なら蚱しおもいいかな。

> そのあたりは色んな技術があるわけなんだけど... 䜕故、inline
> だけが䜿われおいるのかず蚀うず、呌び出し偎だけ芋れば良いから
> なんだろうな。でも、最適化ずいう芳点から芋れば、党䜓を芋なけ
> ればだめなのは圓然なんですけどね。

蚀語だず inline は、マクロよりははるかに芋やすいので、そう
いう意味では蚱すかなあ。register ず同じように、そのうちコン
パむラが無芖するんじゃないかなあ。

inline で意味的に違うのは、オブゞェクトにシンボルが残らない
こずです。昔の Linux (2.2) なんか、この機胜に頌っおいお、
inline を倖す、぀たり、コンパむル・オプション -O2 を取るず、
リンク時に゚ラヌになりたす。デバッグしたいだけなのに。今でも
そうなんでかかね。

In article <septgh9...@astec.co.jp>
Takuya KUDO <ku...@astec.co.jp> writes:
> 組み蟌み向けだずコヌドサむズが無芖できなくおキャッシュに入る
> きるかどうかでパフォヌマンスに倧きな圱響がでたす。

メモリ䜿甚量を枛らすなら、むンタプリタにするずいいんですよね。
昔は段階のむンタプリタもあった思いたした。でも、党郚むンタ
プリタずいうわけにもいかなくお、展開ずいうかコンパむルずいう
か specialize すべき所もあるのでしょうけれど、誰がどうやっお
刀断するんでしょうね。

0 new messages