ToDo:
/etc/src.confに
WITHOUT_DEBUG_FILES= WITHOUT_PROFILE= WITHOUT_TESTS=
を追加して、/usr/obj/usr/src/arm64.aarch64 4.5GBにダイエット成功
ieee_arithmeticモジュール問題( PR255890, GCC PR100662)の問題に関しては、lang/gcc12にパッチを当てて、sad-last.exeが出来るところまでは行った
aarch64-darwin向けに用意されているfpu-aarch64.hを援用したが、fpu-glibc.hの方が良いのかも…
--- libgfortran/configure.host.orig 2022-08-19 17:09:27.740690120 +0900
+++ libgfortran/configure.host 2023-08-09 12:45:37.841351000 +0900
@@ -60,6 +60,10 @@
fpu_host='fpu-aarch64'
ieee_support='yes'
;;
+ freebsd*)
+ fpu_host='fpu-aarch64'
+ ieee_support='yes'
+ ;;
esac
esac
*********** summary of the bench mark
Function Test 6.1534
Optics Test 9.287157
Tracking Test 4.051647999999998
Matching Test .6251829999999998
Overall Score (smaller is faster): .2919677321428571
比較対象として、Ryzen7950X(Tctl 75℃ limit with PBO)だと…
*********** summary of the bench mark
Function Test .641927
Optics Test 1.036083
Tracking Test .3200790000000002
Matching Test .06863999999999981
Overall Score (smaller is faster): .03012566369047619
なので、今時のCPUに対して1桁遅い
Tcl/Tk 8.4だとfpsetroundシンボルが見つからずtclshリンク時に失敗する
/usr/include/machine/ieeefp.hではextern fp_rnd_t fpsetround(fp_rnd_t)で宣言されているが、libcにシンボルが含まれない (amd64環境は入っている)
なんかバグっぽぃ…
GPSレシーバ1号機+Intel N305とGPSレシーバ3号機+Ryzen 5950Xのとある1日のGPS/1PPSによるNTP PLLのトレンドを測定した。
Ryzen5950X環境だと、散発的に発生する大きなPLL offsetスパイクに引きずられて、PLL freqにスパイクで見える
PLL offsetに見えるノイズ成分は、Ryzen5950X環境側はノイズフロアは低いが、スパイク状のノイズが乗り安定性を損なっているように見える (N305環境は暗雑音多めだが、全般的な安定性は優秀)
最近は閏秒挿入を止める方向になっているので、今更感が漂うネタなのだが、 FreeBSDはWITH_ZONEINFO_LEAPSECONDS_SUPPORT付きでビルドするとsystem clockを閏秒付きで運用できる
timezone databaseも変更になるから localtime(3)とかは問題なく動くがgettimeofday(2)などが返すtime_tが閏秒付きの経過秒数になるので、POSIX的に問題が出る このため、FreeBSD libcにはtime2posix(3), posix2time(3)というposix time_tと閏秒付きの time_tを変換するユーティリティ関数が用意されている
さて、WITH_ZONEINFO_LEAPSECONDS_SUPPORT付き環境での時刻同期であるが、同梱のntpやnet/ntp, net/openntpは閏秒挿入分ずれてしまうので、 国際原子時間TAIベースで動作するdjbのsysutils/clockspeed内のclockspeed + sntpclockを時刻合わせに使うことになるのだが、これらは1PPS信号同期に対応していない
というわけで、contrib/ntpを改造してみた(net/ntpへの修正も同一)
ntpの内部実装は、システムクロックがPOSIX time_tであることを仮定しているので、適宜time2posixで変換してやればよいが、kernelからシステムクロックが渡ってくる場所が複数あるので、複数箇所の修正が必要となる
以上3ヶ所の修正で、システムクロックへの閏秒挿入の有無と関係ないくNTP peerの同期および GPS_NMEA + 1PPSな同期が可能になった
diff --git a/contrib/ntp/libntp/systime.c b/contrib/ntp/libntp/systime.c
index 76fba7fe1608..cf99ae317c51 100644
--- contrib/ntp/libntp/systime.c.orig
+++ contrib/ntp/libntp/systime.c
@@ -186,6 +186,7 @@ get_systime(
l_fp lfpdelta;
get_ostime(&ts);
+ ts.tv_sec = time2posix(ts.tv_sec); /* Remove leapsecs on time_t */
DEBUG_REQUIRE(systime_init_done);
ENTER_GET_SYSTIME_CRITSEC();
diff --git a/contrib/ntp/ntpd/ntp_io.c b/contrib/ntp/ntpd/ntp_io.c
index bb35ffd68511..e185001037df 100644
--- contrib/ntp/ntpd/ntp_io.c.orig
+++ contrib/ntp/ntpd/ntp_io.c
@@ -3394,7 +3394,7 @@ fetch_timestamp(
/*
* bintime documentation is at http://phk.freebsd.dk/pubs/timecounter.pdf
*/
- nts.l_i = pbt.sec + JAN_1970;
+ nts.l_i = time2posix(pbt.sec) + JAN_1970; /* Remove leapsecs on time_t */
nts.l_uf = (u_int32)(pbt.frac >> 32);
if (sys_tick > measured_tick &&
sys_tick > 1e-9) {
@@ -3438,6 +3438,7 @@ fetch_timestamp(
}
DPRINTF(4, ("fetch_timestamp: system usec network time stamp: %jd.%06ld\n",
(intmax_t)ptv.tv_sec, (long)ptv.tv_usec));
+ ptv.tv_sec = time2posix(ptv.tv_sec); /* Remove leapsecs on time_t */
nts = tval_stamp_to_lfp(ptv);
}
break;
diff --git a/contrib/ntp/ntpd/ntp_refclock.c b/contrib/ntp/ntpd/ntp_refclock.c
index a16c980e5b09..149f5fefe717 100644
--- contrib/ntp/ntpd/ntp_refclock.c.orig
+++ contrib/ntp/ntpd/ntp_refclock.c
@@ -1596,7 +1596,7 @@ refclock_pps(
/*
* record this time stamp and stuff in median filter
*/
- pp->lastrec.l_ui = (u_int32)ap->ts.tv_sec + JAN_1970;
+ pp->lastrec.l_ui = (u_int32)time2posix(ap->ts.tv_sec) + JAN_1970; /* Remove leapsecs on time_t */
pp->lastrec.l_uf = (u_int32)(dtemp * FRAC);
clk_add_sample(pp, dcorr);
refclock_checkburst(peer, pp);
@@ -1695,6 +1695,7 @@ refclock_ppsaugment(
return FALSE; /* WHICH edge, please?!? */
/* convert PPS stamp to l_fp and apply fudge */
+ timeout.tv_sec = time2posix(timeout.tv_sec); /* Remove leapsecs on time_t */
*stamp = tspec_stamp_to_lfp(timeout);
DTOLFP(ppsfudge, delta);
L_SUB(stamp, delta);
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記