● 実行速度について
部分計算での数値幅の縮小
FIXEDVAL変数が全て同じ数値幅で統一されている時に、数値幅を縮小させた場合、一番大きな値を扱う計算処理がオーバーフローを起こす事があります。しかし、同じプログラム内にある他の計算処理では、その変数を使用してもオーバーフローしないかもしれません。
全部の数値幅を統一するのではなく、計算AにはA専用の変数、計算BにはB専用の変数、というように、各計算毎の括りで必要な分だけの数値幅を定めれば、平均的な速度を速くする事ができるかもしれません。
数値幅を統一しないで個別に変数を持たせると、各計算に結果を渡す際、変換処理が必要になりますが、そのオーバーヘッドが無視できるか否かは、計算処理の規模によります(実験で確かめる必要がある)。
例.
FIXEDVAL i[SIZE],maxcnt[SIZE],temp[SIZE * 2];
fixedutil_setulval32(maxcnt,SIZE,MAX_CNT);
/* for(i = 0;i < MAX_CNT;i++) */
for(memset(i,0,SIZE);fixed_cmp(i,maxcnt,SZIE) < 0;fixed_add32(i,1UL,SIZE)){
/* i *= 570 */
fixed_mul32(i,570UL,temp,SIZE);
memcpy(i,temp,SIZE);
・
・
・
計算にカウンタを使用する場合、FIXEDVAL型の変数で統一すると、計算時の変換処理が不要になります。しかし、カウンタに対する演算量が多く、且つカウンタの変化が int型でも問題無い範囲であれば、int型に変更した方が効率的な場合があります(標準の変数型で出来る範囲の事は fixed X で行わないようにする)。
FIXEDVAL val[SIZE];
int i;
for(i = 0;i < MAX_CNT * 570;i += 570){
fixedutil_setulval32(val,i,SIZE); /* カウンタを FIXEDVAL型に変換 */
・
・
・