link 未来から過去へ表示(*)
link 過去から未来へ表示

link もっと前
   2021年 2月 12日 ---> 2021年 2月 3日
link もっと後

2021年 2月 12日

在宅勤務環境改善

COVID-19 が流行し始めた昨年 2月ころ、在宅勤務が主となりました。当時の気持ちを正直に言えば「すぐ収束して、電車通勤に戻るだろう」で、完全にナメていました。在宅勤務の環境もまったく整えておらず、ダイニングテーブル、ノート PC+8インチのモバイルディスプレイでした。夕食時は邪魔だから、仕事道具をガサガサ片付ける、といった具合です。

そんなこんなで 1年間やってきたものの、COVID-19 の予想外の長期化、それに加えて会社方針(COVID-19 が収束しようとしまいと、今後は在宅勤務)もあって、在宅勤務の環境を改善することにしました。

部屋

家には、奥さんが一昨年の在宅勤務で使っていた部屋があって、幅 100cm の机と背もたれ付きのオフィスチェアがあります。そのスペースを譲ってもらうことにしました。

  • 1年目: 奥さん在宅勤務、私は電車通勤
  • 2年目: 2人共電車通勤
  • 3年目: 奥さん電車通勤、私は在宅勤務

すっかり勤務形態が逆転しました。会社のみなさんの話を聞くと、東京の狭い家で夫婦とも在宅勤務、子供まで自粛で家に居て、全く仕事にならん……みたいな地獄化したご家庭もあるみたい。我が家も夫婦同時に在宅勤務だと、スペースの確保がちょっと大変だったと思います。交代で在宅勤務になったのは、今思えば割とラッキーだったのかな?

テーブル

ダイニングテーブルはしっかりした作りで、間違いなく家で一番上等なテーブルです。一方のダイニングチェアは年中使い続けるような椅子ではなかったらしく、1年間酷使し続けたところ、座面、背面のクッションが潰れ椅子のフレームが腰にガツガツ当たるようになりました。痛ぇよーー。

部屋を移ってスペースが広がったので、大きめのデュアルディスプレイも目指します。幅 120cm の机を買い足し 100cm の机は横向きに合わせ L字にします。

買ったのは山善の AMDT-1260 AMDL-70 という一番シンプルな天板と脚だけのテーブルですAmazon へのリンク)。Amazon で 9,000円くらいとお安いです。理由はわからないですが、山善の公式サイトには載っていないんですよね。なぜだろね?

ディスプレイ

机の幅を考えると 27インチ x2 が載りそうです。ただし、机の奥行きがあまりない(60cm)ので、大きすぎると端が見えなくなって、かえって使いにくいです。という点を勘案して 24インチ x2 にします。

買ったのは EIZO FlexScan EV2480 です。Amazon で 1台 4万円くらい。デュアルディスプレイにしたので、総額 8万円くらい掛かりました。非常に高価ですが、これでも中位機種なんです。ちなみに上位機種の EV2495 は 1台 7万円します。強烈!

FlexScan は重たいのが難点(純正スタンドがめちゃ重い)ですが、変な色やら、映らないやらのトラブルは皆無で非常に快適です。以前勤めてた会社(パナソニックやソシオネクスト)でも大変お世話になりました。良いメーカーですよね。

編集者: すずき(更新: 2021年 2月 15日 11:41)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年 2月 11日

デノーマルフラッシュの速度改善効果

先日(2021年 2月 5日の日記参照)非正規化数(Denormal 数)の計算は遅いと書きましたが、いかほどでしょうか?どのくらい遅いのか、デノーマルフラッシュでどの程度速くなるのか、この 2点について見ていこうと思います。

おそらく世の中のどの FPU も割り算が一番苦手なはずです。入力を正規化数、非正規化数の 2パターン用意して、下記の演算をたくさん実行してみます。

浮動小数点の割り算の速度を測るためのコード(中心部分)

#define SIZE    10000

union uuu {
	double f;
	long long n;
};

...

void test_speed(union uuu *val)
{
	for (int i = 0; i < SIZE; i++) {
		dst[i].f =
			val[i].f / 1.08f -
			val[i].f / 1.07f +
			val[i].f / 1.06f -
			val[i].f / 1.05f +
			val[i].f / 1.04f -
			val[i].f / 1.03f +
			val[i].f / 1.02f -
			val[i].f / 1.01f;
	}
}

コードは全部貼り付けると邪魔くさいので GitHub におきました(GitHub へのリンク)。前回の FTZ, DAZ のテストに使ったコードも一緒に入っています。

x86 系の CPU

まずは x86 系の CPU で測ってみましょう。手元にあるのは Zen 系(AMD Ryzen 7 2700)と、Atom 系(Intel Pentium J4205)なので、この 2つで測ります。コンパイラは gcc (Debian 10.2.1-6) 10.2.1 20210110、最適化レベルは O2 です。

Ryzen 7 2700 の結果(Linux 5.10.9-1)
10000 loops

Normal -----
FTZ:OFF, DAZ:OFF
  0.912859[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:OFF, DAZ:ON
  0.880695[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:OFF
  0.880633[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:ON
  0.880653[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)

Denormal -----
FTZ:OFF, DAZ:OFF
  1.806291[s]
  dst : -4.446591e-323(0x8000000000000009)
FTZ:OFF, DAZ:ON
  0.783578[s]
  dst : 0.000000e+00(0x00000000)
FTZ:ON, DAZ:OFF
  1.513203[s]
  dst : 0.000000e+00(0x00000000)
FTZ:ON, DAZ:ON
  0.783183[s]
  dst : 0.000000e+00(0x00000000)
Pentium J4205 の結果(Linux 5.4.95)
1000 loops

Normal -----
FTZ:OFF, DAZ:OFF
  1.024671[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:OFF, DAZ:ON
  1.025767[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:OFF
  1.025151[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:ON
  1.027414[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)

Denormal -----
FTZ:OFF, DAZ:OFF
  12.147070[s]
  dst : -4.446591e-323(0x8000000000000009)
FTZ:OFF, DAZ:ON
  0.309857[s]
  dst : 0.000000e+00(0x00000000)
FTZ:ON, DAZ:OFF
  7.126950[s]
  dst : 0.000000e+00(0x00000000)
FTZ:ON, DAZ:ON
  0.312373[s]
  dst : 0.000000e+00(0x00000000)

Ryzen 7 2700 でも Pentium J4205 でも、Denormal 数が計算に出現すると遅くなりますが、J4205 はその傾向が顕著で 10倍くらい遅いです。FTZ, DAZ を ON にすると、効果覿面に速くなります。

ARM 系の CPU

次に ARM で測ってみましょう。手元にあるのは RK3399 です。Cortex-A72 と Cortex-A53 が混載されているので、両方で測ります。カーネルは Linux 5.11.0-rc3-next-20210113、コンパイラは gcc (Debian 8.3.0-6) 8.3.0、最適化レベルは O2 です。

ARM は仕様上 FTZ と DAZ が分かれていない(FZ という両方合わせたような機能がある)ので、片方だけ ON にした結果はありません。

Cortex-A72 の結果
$ taskset 0x10 ./a.out 10000

...

10000 loops

Normal -----
FTZ:OFF, DAZ:OFF
  7.153237[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:ON
  7.118581[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)

Denormal -----
FTZ:OFF, DAZ:OFF
  8.008282[s]
  dst : -4.446591e-323(0x8000000000000009)
FTZ:ON, DAZ:ON
  1.779883[s]
  dst : 0.000000e+00(0x00000000)
Cortex-A53 の結果
$ taskset 0x1 ./a.out 10000

...

10000 loops

Normal -----
FTZ:OFF, DAZ:OFF
  11.693382[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)
FTZ:ON, DAZ:ON
  11.691307[s]
  dst : -3.668038e-02(0xbfa2c7c56ca81140)

Denormal -----
FTZ:OFF, DAZ:OFF
  12.196882[s]
  dst : -4.446591e-323(0x8000000000000009)
FTZ:ON, DAZ:ON
  11.697961[s]
  dst : 0.000000e+00(0x00000000)

Cortex-A72 はデノーマルフラッシュの効果抜群ですが、Cortex-A53 はデノーマルフラッシュによる変化はほとんどありません。どちらも ARM が設計した同世代の CPU にも関わらず、速度の傾向は大きく異なります。詳細な理由は ARM にしかわかりませんが、なかなか興味深い結果です。

編集者: すずき(更新: 2021年 2月 13日 02:10)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年 2月 8日

民主主義と人口ピラミッド

最近の日本やら先進国やらの迷走を見ていると、民主主義って人口ピラミッドが逆転することを考慮できていないのでは?と疑問を感じます。

人口ピラミッドが逆転して高齢世代が主流派になると、

  • 人数少の若年世代は支援しない
  • 人数多の高齢世代は支援する

このような政策が支持されるので、少子化はさらに加速し、先のない高齢世代に最大投資しまくる、まさに今の日本みたいな状態になります。当然ながら経済力は下がる一方ですし、滅亡一直線の国家です。

民主主義のバグとしか思えないですね……。

編集者: すずき(更新: 2021年 2月 27日 23:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年 2月 6日

レガシィの半年点検

ディーラーから電話がかかってきて「(車検と一緒にセットで頼んだ)半年点検どうしましょうか?」と聞かれました。実は頼んだことを忘れていたので、確認してもらって助かりました。「半年前の車検で一緒にご依頼されました半年点検なんですが〜」と説明が妙に手慣れた感じだったところを見るに、頼んでおいて忘れてしまう、私みたいな人が多いんだな〜なんて思った。

点検結果はというと、走行系の異常はありませんでした。フロントのウォッシャー液を送るゴムホースが破損していて、フロントのウォッシャー液が出ないうえ、むりやり使ったらエンジンルームにダダ漏れするそうです。え、そうなの??全く気づいていませんでした。ウォッシャー液って全然使わないんだよね……。

部品の取り寄せが要るためすぐには直せず、修理の際はご予約いただきたい、とのことだったので、またどこかの土曜日にでも持っていこうと思います。

スバルのセダンは 1つだけ

私のようなおじさんがディーラーに行くと、新車のカタログをたくさん渡されて「新車どうです?」って話されるんですが、最近のスバルではなーんにも聞かれません。今のスバルはレガシィ B4 GT の乗り換え先がないからです。

スバルの現行車種でセダンはインプレッサ G4 だけです。G4 は上級グレードの 2.0i でも、2リッター NA(154馬力)です。レガシィ B4 GT の 2リッターターボ(280馬力)から乗り換えると大幅パワーダウンは否めず、おすすめしづらいのでしょう。現にディーラーでもカタログだけもらったものの、ほとんどプッシュされませんでした。

ちょっと前なら、インプレッサ WRX S4 STI Sport がありましたが、生産終了してしまいました。仮に現行車種だったとしても、一般人向けとは思えんし、気軽に「WRX S4 いかがですか?」とは言いにくいでしょう。スバルのディーラーにとってセダン乗りは鬼門ですね。

編集者: すずき(更新: 2021年 2月 13日 02:56)

コメント一覧

  • hdk 
    トヨタのディーラーではときどき聞かれます。まぁハッチバックコンパクトカーというジャンルなので確かに車種は豊富なんですが、4人乗り全長3000mmの新車は他社を含めてももう1台もないのに... 
    (2021年02月13日 08:17:11)
  • すずき 
    そこまで珍しいと、売る側としてももう諦めて……って感じでしょうね。 
    (2021年02月13日 15:13:53)
open/close この記事にコメントする



2021年 2月 5日

デノーマルフラッシュ

浮動小数点数の演算では IEEE 754 という規格があり、x86 系のプロセッサはこの規格に基づいた演算を行っています。規格のなかに非正規化数(Denormal Number もしくは Subnormal Number とも)という、極めて小さい特殊な数のカテゴリがあります(参考: IEEE 754 - Wikipedia)。

通常は Denormal 数も正確に演算しますが、Denormal 数の演算は遅いです。計算精度より計算速度が重要な場面では MXCSR レジスタに特殊なフラグを設定することで、Denormal 数の扱いを変更し、高速に演算することができます(参考: FTZ フラグと DAZ フラグの設定 - インテル C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス)。

基本的には Denormal 数を無視して 0 として扱うようにしますが、Intel のプロセッサでは入力側と出力側を別々に扱えるようです。設定可能なフラグは 2つあります。デノーマルフラッシュって必殺技の名前っぽいよね。どうでもいいけど。

FTZ (Flush To Zero)
演算結果が Denormal 数だった場合、ゼロとして扱う。
有効にする方法 _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON)
DAZ (Denormals Are Zeros)
入力が Denormal 数だった場合、ゼロとして扱う。
有効にする方法 _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON)

うーん。わかるような、わからないような。こういうときは実際に動かしてどんな結果になるか試すのが一番良いでしょう。FTZ と DAZ を有効にする方法は Intel コンパイラの説明から抜粋したものですが、GCC でも全く同じ方法で利用可能です。

Denormal Flush の実験プログラム

#include <stdint.h>
#include <stdio.h>
#include <pmmintrin.h>

double zero = 0.0f;

union {
	double f;
	long long n;
} a, b, c, d, ab, ac, ca, dc;

void test()
{
	a.n = 0x0008000000000000ULL;
	b.n = 0x0004000000000000ULL;
	c.n = 0x0010000000000000ULL;
	d.n = 0x0014000000000000ULL;
	ab.f = a.f + b.f;
	ac.f = a.f + c.f;
	ca.f = c.f - a.f;
	dc.f = d.f - c.f;

	printf("  a   : %e(0x%08llx)\n"
		"  b   : %e(0x%08llx)\n"
		"  c   : %e(0x%08llx)\n"
		"  d   : %e(0x%08llx)\n"
		"  a+b : %e(0x%08llx)\n"
		"  a+c : %e(0x%08llx)\n"
		"  c-a : %e(0x%08llx)\n"
		"  d-c : %e(0x%08llx)\n"
		"  a==0: %d\n\n",
		a.f, a.n, b.f, b.n, c.f, c.n, d.f, d.n,
		ab.f, ab.n, ac.f, ac.n, ca.f, ca.n, dc.f, dc.n,
		a.f == zero);
}

int main(int argc, char *argv[])
{
	_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF);
	_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF);
	printf("FTZ:OFF, DAZ:OFF\n");
	test();

	_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF);
	_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
	printf("FTZ:OFF, DAZ:ON\n");
	test();

	_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
	_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF);
	printf("FTZ:ON, DAZ:OFF\n");
	test();

	_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
	_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
	printf("FTZ:ON, DAZ:ON\n");
	test();

	return 0;
}

変数 a と b は Denormal 数です(double の exponent 部分が 0)。変数 c は非常に小さいですが通常の数です。最後の a.f == zero は Denormal 数と 0 を比較したときに、等しければ 1、等しくなければ 0 が出力されます。実行結果とともに説明したほうが良いと思うので、実行結果を示します。

Denormal Flush の動作確認
$ gcc a.c && ./a.out

FTZ:OFF, DAZ:OFF
  a   : 1.112537e-308(0x8000000000000)
  b   : 5.562685e-309(0x4000000000000)
  c   : 2.225074e-308(0x10000000000000)
  d   : 2.781342e-308(0x14000000000000)
  a+b : 1.668805e-308(0xc000000000000)  ★Denorm1 + Denorm2 = Denorm3
  a+c : 3.337611e-308(0x18000000000000) ★Denorm1 + Normal1 = Normal1+α
  c-a : 1.112537e-308(0x8000000000000)  ★Normal1 - Denorm1 = Denorm4
  d-c : 5.562685e-309(0x4000000000000)  ★Normal2 - Normal1 = Denorm5
  a==0: 0                               ★Denorm1 == 0      ? いいえ

FTZ:OFF, DAZ:ON
  a   : 1.112537e-308(0x8000000000000)
  b   : 5.562685e-309(0x4000000000000)
  c   : 2.225074e-308(0x10000000000000)
  d   : 2.781342e-308(0x14000000000000)
  a+b : 0.000000e+00(0x00000000)        ★Denorm1 + Denorm2 = 0(※1)
  a+c : 2.225074e-308(0x10000000000000) ★Denorm1 + Normal1 = Normal1 → 入力の Denormal が 0 扱い = DAZ
  c-a : 2.225074e-308(0x10000000000000) ★Normal1 - Denorm1 = Normal1 → 入力の Denormal が 0 扱い = DAZ
  d-c : 5.562685e-309(0x4000000000000)  ★Normal2 - Normal1 = Denorm5
  a==0: 1                               ★Denorm1 == 0      ? はい → 入力の Denormal が 0 扱い = DAZ

FTZ:ON, DAZ:OFF
  a   : 1.112537e-308(0x8000000000000)
  b   : 5.562685e-309(0x4000000000000)
  c   : 2.225074e-308(0x10000000000000)
  d   : 2.781342e-308(0x14000000000000)
  a+b : 0.000000e+00(0x00000000)        ★Denorm1 + Denorm2 = 0(※1)
  a+c : 3.337611e-308(0x18000000000000) ★Denorm1 + Normal1 = Normal1+α
  c-a : 0.000000e+00(0x00000000)        ★Normal1 - Denorm1 = 0 → 演算結果の Denormal が 0 扱い = FTZ
  d-c : 0.000000e+00(0x00000000)        ★Normal2 - Normal1 = 0 → 演算結果の Denormal が 0 扱い = FTZ
  a==0: 0                               ★Denorm1 == 0      ? いいえ

FTZ:ON, DAZ:ON
  a   : 1.112537e-308(0x8000000000000)
  b   : 5.562685e-309(0x4000000000000)
  c   : 2.225074e-308(0x10000000000000)
  d   : 2.781342e-308(0x14000000000000)
  a+b : 0.000000e+00(0x00000000)        ★Denorm1 + Denorm2 = 0(※1)
  a+c : 2.225074e-308(0x10000000000000) ★Denorm1 + Normal1 = Normal1 → 入力の Denormal が 0 扱い = DAZ
  c-a : 2.225074e-308(0x10000000000000) ★Normal1 - Denorm1 = Normal1 → 入力の Denormal が 0 扱い = DAZ
  d-c : 0.000000e+00(0x00000000)        ★Normal2 - Normal1 = 0   → 演算結果の Denormal が 0 扱い = FTZ
  a==0: 1                               ★Denorm1 == 0      ? はい → 入力の Denormal が 0 扱い = DAZ

(※1)演算結果だけでは、入力の Denormal 数が両方 0 扱いなのか、結果の Denormal 数が 0 扱いなのか、判別できない。

FTZ と DAZ が発生する例を示したつもりです。できるだけ頑張って説明してみたんですが、良くわからなかったらごめんなさい。

編集者: すずき(更新: 2021年 2月 6日 03:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年 2月 4日

不安定な yes

昔(2017年 6月 14日の日記参照)yes の速度を測ったりして遊んでいましたが、改めて Ryzen 7 2700 で yes | pv > /dev/null を実行してみたところ、出力速度が不安定です。

GNU yes 8.32 を単独で実行
[6.73GiB/s](不安定)
GNU yes 8.32 と、隣で while :; do :; done を実行
[6.98GiB/s](若干安定)

出力速度が不安定なときに、top で各 CPU スレッドの負荷を眺めていると、ときどきプロセスが違う CPU スレッドに移動しているようにみえます。コアごとに動作周波数が違うせいか、yes のプロセスが別のコアに移ったとき、移動先のコアが省エネモードから最高周波数に立ち上がるまでのラグが影響しているんでしょうか?どうやって確かめましょうね?特定のスレッドに貼り付けたらエエんかしら??

てなことを最初考えたんですが、実はそんなに難しい話ではなく、単に yes と pv が同じコアに割り付けられたときに、速度的に不利に働いているだけのような気がしてきました。実験するため taskset を使って適当にスレッドを散らします。

隣のスレッド(= 同じコア)
$ taskset 0x2 yes | taskset 0x1 pv > /dev/null
[6.34GiB/s]
2つ隣のスレッド(= 違うコア、コアコンプレックス内)
$ taskset 0x4 yes | taskset 0x1 pv > /dev/null
[7.34GiB/s]
4つ隣のスレッド(= 違うコア、コアコンプレックス内)
$ taskset 0x10 yes | taskset 0x1 pv > /dev/null
[7.20GiB/s]
8つ隣のスレッド(= 違うコア、コアコンプレックス外)
$ taskset 0x100 yes | taskset 0x1 pv > /dev/null
[4.65GiB/s]
12つ隣のスレッド(= 違うコア、コアコンプレックス外)
$ taskset 0x1000 yes | taskset 0x1 pv > /dev/null
[4.66GiB/s]

かなり性能が変わります。コアが同じかどうか?はもちろん重要ですが、Zen アーキテクチャはコアコンプレックスの内か外かで性能に大きな違いが出ます。結果が安定しなかったのはプロセスがコアコンプレックス外に行ったり来たりしていたためでしょうね。

Debian Testing の Linux Kernel(現状、5.10.4-1)は、コアコンプレックスまでは考慮してくれないらしく、コアコンプレックス内と外のコアのどちらで実行しても良いよ、という設定にすると、処理が遅くなる方に割り付けてしまいます。

実行中の top の様子
$ taskset 0x110 yes | taskset 0x1 pv > /dev/null
[4.59GiB/s]


$ top

top - 02:05:53 up 16 days,  9:39, 20 users,  load average: 0.64, 0.96, 1.06
Tasks: 355 total,   3 running, 349 sleeping,   2 stopped,   1 zombie
%Cpu0  :  7.5 us, 75.8 sy,  0.0 ni, 16.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st  ★pv は CPU 0 で動作する
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu8  :  6.0 us, 79.1 sy,  0.0 ni, 14.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st  ★yes は CPU 4 のほうが速いはずだが、CPU 8 で動作する
%Cpu9  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu10 :  0.7 us,  0.0 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu11 :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu12 :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu13 :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu14 :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu15 :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  32106.7 total,    582.9 free,   3532.5 used,  27991.3 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  27906.8 avail Mem

パッと見、法則性が良くわかりませんでした。なるべくビジーなスレッドから遠い番号の CPU スレッドに割り当てようとする?のかもしれませんね。

(※1)Ryzen 7 は 1コア 2スレッドなので、スレッド (0, 1), (2, 3), (4, 5) のように 2スレッドが同じコアで実行されます。

メモ: 技術系?の話は Facebook から転記しておくことにした。後半を加筆。

編集者: すずき(更新: 2021年 2月 4日 02:15)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2021年 2月 3日

Zephyr と QEMU のリセット その 2 - 実装編

目次: Zephyr を調べる - まとめリンク

Zephyr にはリブートを行う関数 sys_reboot() が既に実装されており、アーキテクチャごとのリブート用関数 sys_arch_reboot() を呼ぶ仕組みです。

QEMU RISC-V virt マシンのリブート処理を実装

// zephyr/subsys/power/reboot.c

void sys_reboot(int type)
{
	(void)irq_lock();
#ifdef CONFIG_SYS_CLOCK_EXISTS
	sys_clock_disable();
#endif

	sys_arch_reboot(type);    //★★アーキテクチャごとのリブート関数を呼ぶ

	/* should never get here */
	printk("Failed to reboot: spinning endlessly...\n");
	for (;;) {
		k_cpu_idle();
	}
}


// zephyr/soc/riscv/riscv-privilege/virt/soc.c

/* Reboot machine */
#define FINISHER_REBOOT		0x7777

void sys_arch_reboot(int type)
{
	volatile uint32_t *reg = (uint32_t *)SIFIVE_SYSCON_TEST;

	*reg = FINISHER_REBOOT;    //★★0x100000 に 0x00007777 を Write

	ARG_UNUSED(type);
}


// zephyr/soc/riscv/riscv-privilege/virt/soc.h

#include <soc_common.h>
#include <devicetree.h>

#define SIFIVE_SYSCON_TEST           0x00100000    //★追加
#define RISCV_MTIME_BASE             0x0200BFF8
#define RISCV_MTIMECMP_BASE          0x02004000

実装は素直に sys_arch_reboot() を追加しただけです。そんなに難しくないですよね。

動作確認

前回説明した通り、サンプルアプリの shell を使って動作確認します。

リブートの動作確認
$ cmake -G Ninja -DBOARD=qemu_riscv32 ../samples/subsys/shell/shell_module/
$ ninja menuconfig
★★CONFIG_REBOOT と CONFIG_BOOT_BANNER を有効にする

$ ninja run

[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: riscv32
*** Booting Zephyr OS build v2.5.0-rc1-276-ge7d3bb714bc2  ***


uart:~$ kernel reboot cold
★★↑ここでリブートされる

*** Booting Zephyr OS build v2.5.0-rc1-276-ge7d3bb714bc2  ***


uart:~$ 

無事リブートしました。本当にリブートしてるのか不安になるくらい速いです。Zephyr は起動時に何も言わないので、Linux と比べるとリブートは簡素に見えますね。速いのは良いんだけど、感動がちょっと薄いのが難点かも?

編集者: すずき(更新: 2021年 2月 6日 01:04)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2021年 2月 12日 ---> 2021年 2月 3日
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 3/6 03:18

カレンダー

<2021>
<<<02>>>
-123456
78910111213
14151617181920
21222324252627
28------

最近のコメント 5件

  • link 21年02月28日
    すずき 「ですね、その辺りも違います。違いを全部示...」
    (更新:03/06 00:21)
  • link 21年02月28日
    hdk 「109と109Aって、かなの記号も違うん...」
    (更新:03/05 21:43)
  • link 21年02月14日
    すずき 「そうですね、1年だけとか、出張の時だけ、...」
    (更新:02/15 11:27)
  • link 21年02月14日
    hdk 「テレビデオも壊れたときがと聞いて買いませ...」
    (更新:02/15 06:24)
  • link 21年02月06日
    すずき 「そこまで珍しいと、売る側としてももう諦め...」
    (更新:02/13 15:13)

最近の記事 3件

link もっとみる
  • link 21年03月04日
    すずき 「[VSCode を使って Windows から Linux ア] ...」
    (更新:03/06 03:18)
  • link 21年03月03日
    すずき 「[VSCode を使って Windows から Linux ア] ...」
    (更新:03/06 02:30)
  • link 21年02月28日
    すずき 「[JIS 配列キーボードと OADG 配列キーボード] 今まで、い...」
    (更新:03/05 18:34)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報