マンデルブロ集合計算の同じプログラムを他のCPUボードで動かしてみました
コンパイラはTMS320C30/40用のCL30.EXEで行っていますが
さすが浮動小数点DSP用のコンパイラだけあってインラインで専用命令を生成してくれます
たとえばこれは判定関数mandel_chk()部分をコンパイラが吐いたアセンブラコードですが
全くムダがありません
さすが浮動小数点DSP用のコンパイラだけあってインラインで専用命令を生成してくれます
たとえばこれは判定関数mandel_chk()部分をコンパイラが吐いたアセンブラコードですが
全くムダがありません
TMS320C30 アセンブラコード _mandel_chk: push fp ldiu sp,fp ldiu 1,r1 addi 5,sp ldfu 0.0000000000e+00,f0 sti r1,*+fp(5) cmpi 8192,r1 bged L13 ; Branch nop stf f0,*+fp(2) stf f0,*+fp(1) ; Branch Occurs to L13 L10: ldfu *+fp(1),f2 ldfu *+fp(2),f1 ldfu f2,f0 mpyf *+fp(2),f1 mpyf *+fp(1),f2 mpyf 2.0000000000e+00,f0 subrf f2,f1 mpyf *+fp(2),f0 addf *-fp(2),f1 subf *-fp(3),f0 stf f1,*+fp(3) stf f0,*+fp(4) ldfu f0,f1 ldfu *+fp(3),f0 mpyf *+fp(4),f1 mpyf *+fp(3),f0 addf3 f0,f1,f0 cmpf 4.0000000000e+00,f0 bled L12 ; Branch ldile 1,r2 ldfle *+fp(4),f0 ldfle *+fp(3),f1 : :
同じ部分を80386ボードで使ったコンパイラLSIC-86が生成したものは
浮動小数点の四則演算するにもわざわざライブラリ内関数を呼びに行くので
コプロがあってもオーバヘッドでかなり食われてしまいます
浮動小数点の四則演算するにもわざわざライブラリ内関数を呼びに行くので
コプロがあってもオーバヘッドでかなり食われてしまいます
8086 アセンブラコード mandel_chk_:: PUSH BP MOV BP,SP SUB SP,32 PUSH DX CALL _ELDE_I## DB 0,0,0,0,0,0,0,0,0,0 ; LEA BX,[BP-8] CALL _ESTD_SS## LEA BX,[BP-16] CALL _ESTPD_SS## ; MOV AX,1 JMP _1 _2: LEA BX,[BP+4] CALL _ELDD_SS## ; LEA BX,[BP-8] CALL _ELDD_SS## ; LEA BX,[BP-8] CALL _ELDD_SS## ; CALL _EMUL## LEA BX,[BP-16] CALL _ELDD_SS## ; LEA BX,[BP-16] CALL _ELDD_SS## ; CALL _EMUL## CALL _ESUB## CALL _EADD## LEA BX,[BP-24] CALL _ESTPD_SS## : :
実行中の様子
結果ですが演算時間は25分(クロック32MHz)。
ハードの違いはありますが、やはり生成されるコードの質による
影響も大きいです
影響も大きいです