目次: RISC-V
先日購入したHiFive Unleashedが異様に遅く感じるので、手持ちの64bitコア同士でベンチマーク対決をしてみました(2019年12月5日、Raspberry Pi 3の結果を追記)。以前、モナコインのマイナーでベンチマークしたとき(2019年5月27日参照)は、Cortex-A53の1/4くらいの性能でした。
ベンチマークはCoreMarkを使いました。コンパイル条件は下記の通りです。
RK3399, RK3328はDebian arm64 Stableを使っています。StableはRISC-Vに対応していませんので、FU540だけはDebian riscv64 Unstableを使っています。BCM2837はRaspbianです。
測定の結果は、
RK3328とFU540は2倍の差です。動作周波数の差は1.3倍ですから、インオーダーのコア同士にしては性能差があります。
RK3399は異様に速いです。もしかするとA72側で動いているかもしれません。CoreMarkは特定のCPUに張り付ける方法が良くわからないですね……。
メモ: 技術系の話はFacebookから転記しておくことにした。多少追記。後日追記。
 この記事にコメントする
 この記事にコメントする
目次: RISC-V
SiFive FU540のコア動作周波数は簡単に見ることはできなかったので、求め方をメモしておきます。
アドレス0x10000000にPRCI(Power Reset Clocking Interrupt)のレジスタがありますので、実機でその辺をダンプします。
突然ダンプしますって言われても、どうしたら良いんですか?という方は拙作のmemaccess(GitHubへのリンク)をお使いください。使い慣れたツールがあれば、RISC-V上でビルドすれば使えます(UnleashedはLinuxが動くので)。
私の持っているHiFive Unleashedでは下記のようになっていました。
10000000 c0000000 82110ec0 00000000 82110dc0 10000010 80000000 00000000 00000000 82128ec0 10000020 80000000 00000000 0000002f 00000004
COREPLL周波数を司るレジスタは、corepllcfg0(offset: 0x04)です。値は0x82110ec0ですね。
レジスタの各フィールドはこんな意味になっています。計算式は、
COREPLL = 33.33MHz / (divr + 1) * 2 * (divf + 1) / 2 ^ divq
ですので、上記の値を当てはめますと、
COREPLL = 33.33MHz / (0 + 1) * 2 * (59 + 1) / 2 ^ 2 = 33.33 * 120 / 4 = 999.99MHz≒1GHz
すなわち1GHz駆動であることがわかります。
ウソは書いていないつもりですが、情報源が気になる方はFU540の仕様書 "Chapter.7 Cloking and Reset" の章を見てください。
FU540の仕様書はSiFiveのサイト(FU540のサイトへのリンク)から、誰でもゲットできます。ページの下側かつ左側にある "FU540-C000 Manual" と書いてあるリンクです。
Unleashedは面倒でしたが、Rockchip系(に限らないと思いますが)のSoCは /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freqを見ると簡単に最大動作周波数を取得できます。
$ for i in /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq ; do echo $i; cat $i; done /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 1296000 /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq 1296000 /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_max_freq 1296000 /sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_max_freq 1296000
$ for i in /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq ; do echo $i; cat $i; done /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq 1416000 /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq 1416000 /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_max_freq 1416000 /sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_max_freq 1416000 /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_max_freq 1800000 /sys/devices/system/cpu/cpu5/cpufreq/cpuinfo_max_freq 1800000
簡単で良いですね。こういう細かい使い勝手はRISC-Vはこれからでしょうか。とはいえ世界はRISC-V旋風が吹き荒れているそうなので、次第に充実していくことでしょう。
メモ: 技術系の話はFacebookから転記しておくことにした。大幅に追記。
 この記事にコメントする
 この記事にコメントする
目次: ARM
ある時からlinux-nextでROCK64のPCMデバイスが全部消えて、一切音が鳴らなくなっていました。ROCKPro64も同じようです。
結論だけ先に言うと、この問題は既にALSA MLで指摘されていて、下記のコミットをリバートすると直ります。
commit b9f2e25c599bbbf0646957e07ebb72b942c286cc
Author: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date:   Thu Jun 20 09:49:33 2019 +0900
    ASoC: soc-core: use soc_find_component() at snd_soc_find_dai()
    snd_soc_find_dai() finds component first via specified
    snd_soc_dai_link_component, and find DAI from it.
    We already have soc_find_component() to find component,
    but soc_find_dai() has original implementation to find component.
    We shouldn't have duplicate implementation to do same things.
    This patch uses soc_find_component() at soc_find_dai()
    Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
これは散々調べた後で知りました。悲しい。せっかくなので調べたこともメモしておきます。
最近、ALSA SoC Layer(以下、ASoC)は、ルネサスの森本さんという方の尽力により、実装がかなり変わっているのですが、その一部がバグっていたようです。
ASoCは大まかにいうと、登録と組み合わせの2段階に分かれています。
ドライバのprobe時に、2つのcomponentを登録します。正式な呼び名がわからないので、ここではとりあえずPCMとDMACのcomponentと呼びます。
PCM componentはDAI(Digital Audio Interface)を持っています。DAIはPCMデータの入出力インタフェースのことらしいです。他にもCODECと呼ばれる、PCMデータ(デジタル音声)←→ アナログ音声に変換するドライバもcomponentとして扱われています。
サウンドカードのドライバは、複数のcomponentを組み合わせて、PCMの入出力やアナログ音声出力などを実現する仕組みです。
もう少しコード寄りに説明するとPCM componentはdevm_snd_soc_register_component() を使い、DMAC componentはdevm_snd_dmaengine_pcm_register() を使って登録します。
これらの関数を呼び出すと、
devm_snd_soc_register_component()
  snd_soc_register_component()
    snd_soc_add_component()
      snd_soc_register_dais()
        soc_add_dai()          ★DAIをcomponentに登録★
      snd_soc_component_add()
        list_add(&component->list, &component_list); ★componentをリストに登録★
devm_snd_dmaengine_pcm_register()
  snd_dmaengine_pcm_register()
    snd_soc_add_component()
      snd_soc_component_add()
        list_add(&component->list, &component_list); ★componentをリストに登録★
このような経路を辿ります。
一方、componentを組み合わせる際は、
devm_snd_soc_register_card()
  snd_soc_register_card()
    snd_soc_bind_card()
      snd_soc_instantiate_card()
        soc_bind_dai_link()
          snd_soc_find_dai()
            soc_find_component() ★最近変更された部分、適切なcomponentを探す、しかし…★
このように処理されます。
前置きがかなり長くなりましたが、上記の処理のうちsnd_soc_find_dai() の変更にバグがあるようです。元々は関数内にcomponentを探す処理が記述されていましたが、処理は削除されsoc_find_component() で適切なコンポーネントを探してくる、という実装に変わりました。
先ほど説明した通り、大抵のASoCドライバはPCM用のcomponentをdevm_snd_soc_register_component() で、DMAC用のコンポーネントをdevm_snd_dmaengine_pcm_register() で登録しますが、かなり残念なことに双方とも全く同じ名前で登録されてしまいます。
例えばROCKPro64で /sys/kernel/debug/asoc/componentsを見ると、
root@rockpro64:/# cat /sys/kernel/debug/asoc/components hdmi-audio-codec.3.auto ff870000.spdif ff870000.spdif ff8a0000.i2s ff8a0000.i2s ff890000.i2s ff890000.i2s ff880000.i2s ff880000.i2s spdif-dit snd-soc-dummy
このように、同じ名前のcomponentが2つ登録されていることがわかります。今回のバグの件をさておいても、名前が重複しているのはイマイチですよね……。
組み合わせる際はdevm_snd_soc_register_component() で登録した方、つまりPCM用のcomponent(こいつがDAIを持っている)を探してこなければ、PCMデバイスは正常に登録されません。
しかしsoc_find_component() は動きがおかしくて、devm_snd_dmaengine_pcm_register() で登録した方のコンポーネントを返してしまいます。
結果、DAIが見つけることができず、エラーになってしまい、1つもサウンドカードが登録されないままドライバの登録処理が終わります。
この問題を散々調べた後で、既にALSA MLにて指摘されていたことを知りました。
ALSA MLを最初に調べれば、こんなにコード解析しなくても良かったなあ、と思う一方で、そもそもどういうバグかわからないと、メールは探せないので、鶏と卵ですね。
それと、今に始まったことではありませんが、ASoCは似たような名前の関数が多くて混乱します。先ほど説明にも出ましたが、snd_soc_add_component() とsnd_soc_component_add() なんて、一見で違いがわかりません。何でこんな変な名前にしたんだろう……。
メモ: 技術系の話はFacebookから転記しておくことにした。大幅に追記。
 この記事にコメントする
 この記事にコメントする
以前、出張先にノートPCのアダプタ(USB-PD)を忘れて帰ってきてしまったことがあります。
我が家のノートPCの電源端子はUSB Type-Cなので、試しにスマホ用の充電器を繋いでみたのですが、うんともすんとも言いませんでした。ノートPCなどUSB-PDで充電する機器は、充電器側もUSB-PDに対応していないと充電が開始されないみたいです。
次のミスに備えて、普段使いの充電器+ノートPCアダプタの代打、が可能なAUKEYのUSB-PD充電器PA-Y12(AUKEY PA-Y12のサイト)を買いました。Amazonで5,000円くらいです。
大きさは手のひらサイズくらいですね。端子はType-C + Type-A x 2の3ポートで、出力は合計72W(Type-C: USB-PD 20V 3A, Type-A: 5V 2.4A)ですから、大抵のUSB-PD機器には対応できるはずです。
普段はスマホ(USB type-C)とKindleの充電にしか使っていないので、若干勿体ない感が否めないですが、備えあれば憂いなし。
購入は先月(5/25)で、使用して1か月ほど経っていますが、特に異音や異常もなく元気に動いくれています。良い感じです。
メモ: 技術系の話はFacebookから転記しておくことにした。多少追記。
 この記事にコメントする
 この記事にコメントする
| < | 2019 | > | ||||
| << | < | 07 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 | 
| - | 1 | 2 | 3 | 4 | 5 | 6 | 
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | 
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | 
| 21 | 22 | 23 | 24 | 25 | 26 | 27 | 
| 28 | 29 | 30 | 31 | - | - | - | 
 wiki
 wiki Linux JM
 Linux JM Java API
 Java API 2002年
 2002年 2003年
 2003年 2004年
 2004年 2005年
 2005年 2006年
 2006年 2007年
 2007年 2008年
 2008年 2009年
 2009年 2010年
 2010年 2011年
 2011年 2012年
 2012年 2013年
 2013年 2014年
 2014年 2015年
 2015年 2016年
 2016年 2017年
 2017年 2018年
 2018年 2019年
 2019年 2020年
 2020年 2021年
 2021年 2022年
 2022年 2023年
 2023年 2024年
 2024年 2025年
 2025年 過去日記について
 過去日記について アクセス統計
 アクセス統計 サーバ一覧
 サーバ一覧 サイトの情報
 サイトの情報合計: 
本日: