next up previous
Next: 実行系の改良 Up: 解析系の改良 Previous: 解析結果の統合と分割コンパイル

ループ展開

gifに示すquick sortでは,qsort/3の再帰節4を実行する際に, 2回のゴール呼出/復帰が生じる。しかしこのプログラムをgif のように変形するとゴール呼出/復帰を1回とすることができる。

  
図 : プログラム quick sort

  1. : main :- list1( L ) , qsort2( L,S ),
      io :outstream3( [ print(S) , nl ] ).

  2. : list( L ) :- L =4 [ 27,74,17,33,94 ].

  3. : qsort( L, R ) :- true | qsort5( L,R,[] ).

  4. : qsort( [ X | L ],R,R0 ) :- true | partition6( L,X,L2 ),
      qsort7( L2,R1,R0 ), qsort8( L1,R,[X | R1] ).

  5. : qsort( [],R,R0 ) :- true | R =9 R0.

  6. : partition( [ X | L ],Y,XL1,L2 ) :- X=< Y | XL1 =10 [ X | L1 ],
      partition11( L,Y,L1,L2 ).

  7. : partition( [ X | L ],Y,L1,XL2 ) :- X >=Y | XL2 =12 [ X | L2 ],
      partition13( L,Y,L1,L2 ).

  8. : partition( [],_,L1,L2 ) :- true | L1 =14 [], L2 =15 [].

  
図 : プログラム quick sortのループ展開

  1. : main :- list1( L,L,S ),
      io : outstream3( [ print( S ),nl ] ).

  2. : list( L,A,B ) :- L =4 [ 27,74,17,33,94 ], qsort2( A,B ).

  3. : qsort( L,R ) :- true | qsort5( L,R,[] ).

  4. : qsort( [ X | L ],R,R0 ) :- true | partition6( L,X,L1,L2,L2,R1,R0 ),
     qsort8( L1,R,[ X | R1 ] ).

  5. : qsort( [],R,R0 ) :- true | R =9 R0.

  6. : partition( [ X | L ],Y,XL1,L2,A,B,C ) :- X=< Y | XL1 =10 [ X | L1 ],
     partition11( L,Y,L1,L2,A,B,C ).

  7. : partition( [ X | L ],Y,L1,XL2,A,B,C ) :- X >=Y | XL2 =12 [ X | L2 ],
      partition13( L,Y,L1,L2,A,B,C ).

  8. : partition( [],_,L1,L2,A,B,C ) :- true | L1 =14 [], L2 =15 [],
      qsort7( A,B,C )

このような変形をプログラムの意味を保存して行なうには,まずゴール partition6qsort7の実行を逐次化できることが条件となるが,これに ついてはスレッド化により保証される。したがってqsort7の直接の left-siblingであるpartition6が以下の条件を満たしていることから,意味を 保存したプログラム変形が可能となる。

  1. プログラム中の全てのゴールpartition/4のsuccessorはqsort/3である。

  2. partition/4から節qsort/3:4が直接または間接に呼び出されることはない。

このような変形をKLIC標準配布パッケージに含まれる2種のプログラムに適用した結 果,表gifに示すようにqsort, pascalでは 420% の速度向上が得られた。

  

プログラムorgGSloop
qsort 実行時間[ms]
速度比
GC[回数]
487
1.00
43
477
1.02
24
465
1.04
26
pascal 実行時間[ms]
速度比
GC[回数]
1201
1.00
92
1150
1.04
27
1000
1.20
36

表: ループ展開の効果



next up previous
Next: 実行系の改良 Up: 解析系の改良 Previous: 解析結果の統合と分割コンパイル



www-admin@icot.or.jp