yasu のすべての投稿

さいきんのお仕事

なんか気がつくと blog もすっかり放置なので、たまには最近やってることでも書いておこうと思いました。そういえば沖縄にきて10年ですし。

本業はあいかわらず計算機アーキテクチャというか、custom computing とか reconfigurable computing とよばれることをやっているつもりです。すごく簡単に説明すると、みんなが同じハードウェアのコンピュータを使うんじゃなくて、やりたいことに応じたハードウェアをぱっとその場で手に入れて、より高速でより省電力なシステムを実現する、みたいな研究です。

これ、学生時代にやり始めたころはわりとぶっ飛んでる部分もあったのですが、最近はスパコンの人たちもちょっとずつこっちに流れてきて、そうすると、僕ひとりと学生さん数名でやってる研究室では、予算規模とか実装能力で全然太刀打ちできないので、さすがにしんどいなーと思ったり、まあ僕は僕で他の人のできないところを攻めればいいかーっていうことで、高速データ通信のハードウェアをごりごりいじってみたりしています。もちろん市販の製品を使うので、ものすごい新規性があったりするわけじゃないのですけれども、中身を理解してなくても使えてみんなそうやってるものを深く掘り下げて理解するの、めちゃめちゃ楽しいしそれがないと始まらない楽しい(あるいは、まわりの追随を許さない)こともいろいろあるなーと思っています。

あと、最近は学科のえらい先生にお誘いいただいて、短波海洋レーダーというのをはじめました。僕は無線とか全然わからないのですが、FPGAならちょっとだけわかるので、それでレーダーの送受信機を作っています。1台目は新潟大の屋上に設置した24MHz帯のレーダーで、こちらは新潟大の学生さんのオペレートで新潟の海を見ています。波長12m なのですが、まあ、アンテナはでかい。めっちゃでかい。

沖縄にちょっと来る前に納豆菌のゲノム読むプロジェクトのお手伝いをさせていただいたのですけれど、「まだ人類の他の誰も手にしたことのないデータ」が自分の Mac に入っている、ってめちゃめちゃ面白いな、ってそのときに思いました。納豆、毎日食べてる人は僕以外にも1億人くらいはいそうだけど、納豆菌のゲノム配列ならおれのMacに入ってるぜ、っていう人はそれまでたぶん、ミツ○ンとかタカ○フーズの研究の人で、配列はあるけど社外秘、みたいな感じだったんだと思いますが、それをオープンな形で、しかも当時出たばかりの NGS で読んでいくの、めちゃめちゃ興奮しました。ただ、あの頃の NGS は長いリードがとれないから納豆菌のリピート配列を越えられなかったんじゃ・・・(そのあと鎌田先生が僕のホネをひろってくれました、PacBio のシーケンサすごい。)

あ、それで、すっかり話がそれましたが、昨年から今年にかけては新しく 13.5MHz 帯のレーダーを作らせていただく機会を得ました。静岡は御前崎に設置で、年末は海辺でヘルメットに作業着安全靴着用でひたすらアンテナ組み立てておりました (立てたのは主に学生さんたちです、すごいよみんな。) 御前崎からだと駿河湾のほぼ全域が見える、という目論見ですが、いろいろの事情で送受信機の調整と検査は年明けに延びてしまって、今回はそのために教員二人だけで出張。連日延々といろいろ直したり測定したり議論したりデバッグしたり。

デジタルフィルタもフーリエ変換も交流回路も電波もなにもかも、学生時代に全然わからなくて避けて通ってきたことなんですけども、ちゃんとやっときゃよかった、という気持ちでいっぱいになりつつちょっとずつ勉強していく日々です。めっちゃたのしい。

学生の皆さんは「これ全然わかんないし、なんの役に立つんだよ!」っていうこと、けっこうたくさんあると思うんですよね、でもできれば踏ん張ってほしいし、少なくとも「こういうことがあるのか・・・」ということは覚えておいてほしい、それさえ知ってれば、必要になったときに、なんとかなるんだ、たとえ学生時代に単位が取れなかったとしても!

あと、素粒子とかは全然わかりませんが、CERN でご活躍の先生にお声がけいただいて、加速器のデータ収集システムとかもちょっと始めています。物理ぜんぜんわかんないんですけど、僕がちょっとだけできる計算システムの設計技術が、人類が新たに手に入れる知識の手助けになるのとか、めっちゃかっこいいじゃないですか。

生物も海洋も物理も全然わかんないんですけど、

最高のエンジニアリングの先にある新たな人類の地平線、みたいなの最高にクールだし、そういうのをずっと見ていきたいなあ、というのが、最近ちょっと考えていることです。

ThinkPad x61 のファン

ThinkPad x61 をしばらく家でサーバとして使っていたのだけれど、起動時に Fan error が出るようになってしまった。ファンは回っているし、Esc 連打で起動するのだけど、さすがに10年を超えているし、別の機材に役目を交代させました。

で、サーバとして使っている間はずっとフタ閉じてたのですが、久しぶりに引っ張り出してみるとキーボードも本体の作りもしっかりしてるし、やっぱり捨てるにはもったいないので、とりあえず Fan error だけでもなんとかしようと。

あけてみると、外から見えているヒートシンクのところとは別に、パームレストの下、PCカードスロットの右に小さいファンがついていて、これが固着している模様。なお、その隣はモデム (!) と WiFi/Bluetooth モジュールです。もう一つ PCI っぽいなにかが出ているのは、WiMax 用のスロットな模様。

非常に薄いファンなのですが、外して眺めると、3箇所金属のツメでとまっていたので、ラジオペンチの先でぐいっとやると、あきました。ファンの羽根の部分もえいやっと引き抜いたら、抜けた。

で、軸受けのところにシリコンオイルを軽く挿したら、ファンが指で軽く回るようになりました。電源を入れたときにも回る模様。その日は Fan error 消えなかったのですが、後日ちゃんと消えました、しばらく子供用にでも使おうと思います。

Ultra96v2 にファンをつけた

新しい Ultra96v2, ファンレスになって静かだわー って思ってたけど、かなり熱くなりますね。ファンをつけるための電源は出ているので、つけましょう。回路図をみると、ファンは 5V なので、いつも使っているNidecの F310R-05LLC にしました。

用意したものは以下の通りです。

– ファン (Nidec F310R-05LLC)
– M2.6の六角スペーサー (20mmだけどたぶん25mmくらいがよい)
– 3mm x 16mm のトラスタッピングねじ (ファン固定用)

基板の4隅のネジを外して一旦ヒートシンクから外してハンダ付けします。TP25が5V, TP26がGNDです。

もともとついているスペーサーだとちょっと短いので、手元にあった 20mm の M2.6 スペーサーに付け替えました。ネジが長いので、ヒートシンクから基板側に飛び出していますが、基板に接触はしていないことを確認しています。自分で交換する時は気をつけましょう。なお、F310Rをつける場合、20mm でもまだちょっと短いです。

3mm x 16mm のトラスタッピングねじで、ヒートシンクの溝の部分にファンを固定します。

下から上、ヒートシンクに向かって吹き付ける向きでつけています。スペーサが短いので、机とファンの間の隙間はネジの頭の分くらいになってしまいましたが、ファンなしと比べると各段に冷えています。やったー!

Alveo U50のHBM

ひきつづきAlveo U50を動かすお話です。以前、FixstarsさんのところでU50のXDMAを動かした記事 を拝見して、同じように UltraRAM を接続して Core i3-6100 + DDR4-2133 Dual channelで動かしてみたら、こんな感じでした。

Write Performance 
** Average BW = 8388608, 10296.580078
Readback and Compare
** Average BW = 8388608, 4462.804199
Read Performance
** Average BW = 8388608, 9191.814453

Fixstars さんの POWER8 なホストでは 12GB/s とか出ているので、この差は CPU パワーだったりメモリシステムだったりするのでしょうか。単に DMA 転送しているだけだと CPU 使用率がスカスカで、すぐクロックが下がって DMA まで遅くなってしまうので、裏で yes > /dev/null してクロック周波数を維持しています (本当はちゃんとクロック周波数のコントロールを設定すればいいのですが。)

それで、HBM を XDMA に接続するのはなんとなくめんどくさそうで二の足を踏んでいたのですが、そろそろ本気出さないといけない感じになってきましたので、とりあえずやってみることにしました。方針としては、

  • あとで並列アクセスをする気がするので、とりあえず HBM IP コアの global addressing の機能はつかわない
  • とりあえず 1ch、512MB だけ動かす
  • HBM reference clock (100MHz) は SYSCLK3  (BC18, BB18) から
  • それ以外のクロックは SYSCLK2 (G16, G17) と、それで駆動する MMCM から
  • HBM IP の AXI インタフェイスは MMCM で 450MHz を作ってそれで駆動

ということにしました。いろいろと紆余曲折があって、今日も半日くらい使ったのですが、ブロックデザイン全体・HBM IP のチャネルの設定・アドレスマップは以下のようになっています。


CLK100 とか RST100_N はブロックデザインの外側の RTL で、CMC_CLK から作っています。アドレスマップをみると unmapped slaves があるので、あれ、と思う方もいらっしゃるかもしれませんが、global addressing を切ってしまうと、8つあるメモリチャネル (512MB) を半分ずつにした 256MB の (pseudo channel に対応した) 領域が 16あるAXIインタフェイスと1:1の関係になるようで、SAXI_00 だけでは正しく動作しませんでした。転送速度を UltraRAM のときと同じように測定すると、

Write Performance
** Average BW = 536870912, 10075.326172
Readback and Compare
** Average BW = 536870912, 4533.174316
Read Performance
** Average BW = 536870912, 9016.518555

ということで、ひとまずバンド幅はちゃんと出ているようですが、AXI Interconnect を性能側に振った設定にして、出力の register slice などを on にしないとタイミングが meet しなかったので、左右両スタックの HBM をこのまま 16ch + 16ch で AXI interconnect に直結するのはちょっと性能的に厳しそうで (AXI interconnect のポート数の制約もあるし) 、やはり global addressing を利用するのが賢いのかなあ、という気がしています。

Alveo U50のUART

Alveo U50 を使うことになって、ちょっとずついろいろ試しているのですが、ようやく Alveo U50 Getting Started に掲載されている Vivado 用の XDC ファイルが更新され、U50 SFP (Production版) のファイルになりました。

以前公開されていた U50DD (ES版) の XDC ファイルは中身がだめだめだったのですが、今回はわりとちゃんとしているようです。PCIe 関係などは XDC がなくてもボードファイルをのぞけばピン配置などがわかったのですが、XDC ファイルにはそれ以外の情報も掲載されていて、たとえば、

# Bank 65 and 68 FPGA UART Interface 0/1/2 to DMB-01 (User selectable Baud) 
#    FPGA_UART0/1/2_RXD  Input from DBM-01 UART to FPGA 
#    FPGA_UART0/1/2_TXD  Output from FPGA to DBM-01 UART 

とあって、どうやらプログラミングケーブルを経由して UART が使えるようです。

で、3つ使える、とあるのですが、試してみたところ使えるのは 0, 1 のみで、2 は未接続な感じです。プログラミングケーブルに搭載されているのは FT4232 で、4ポートの UART ポートがあるのですが、これはどうやら

  1. JTAG
  2. (未接続?)
  3. FPGA_UART0
  4. FPGA_UART1

というふうに接続されているようです。1. の JTAG ポートは、はじめ /dev/ttyUSBx として見えているのですが、Vivado や xsdb などで接続すると消えてしまうので、JTAG ポートということなのでしょう。

なお、プログラミングケーブルには「使わない」と書かれている MicroUSB ポートがもうひとつあるのですが、こちらに接続するとやはり FT4232 が現れます。Vivado の Hardware Manager でのぞいてみると、ARM DAP が現れますので、こちらはサテライトコントローラのMSP432と、その UART ポートが接続されていそうです。

MacPorts で gnutls

研究室の環境もぼちぼちMojaveにアップデートしつつあるのですが、Emacs + Wanderlust でメールを読もうとしたらいきなりクラッシュ。なんでかー、と思って backtrace を眺めたらどうやら IMAP で STARTTLS しようとして、 gnutls-cli を呼んだところで落ちている。Ivy Bridge とか Haswell な Mac だとダメで、いまどきの新しい Mac なら問題ないようだ。つまり、SSEx だとかその手のやつですよね。

というわけで、
% gnutls-cli –startls-proto=imap my.mail.server
としたら本当に落ちるじゃありませんか。しかも Illegal instruction だと…

で、どうやら gnutls の問題じゃなくて、GMP の問題らしい: http://lfsbookja.osdn.jp/7.10/chapter06/gmp.html

MacPorts の枠組みの中でなんとかならんかなー、と思った結果、GMP に core2 という variant があるので、これを使えば Core2 アーキテクチャまでの最適化しかしない、ということで、とりあえず解決。よかった… (まあ GMP でごりごり、みたいなことはしないので、いいか)

FreeBSD + LDAP + tcsh

SunOS4と386BSDでUnixを使い始めて20年ちかく、csh/tcshを使ってきたのですが、研究室の環境をFreeBSD 10.2に更新してから、ctrl+cでシェルが死ぬ、という問題が起こるようになりました。入力しかけのコマンドをキャンセルしたいときとかにもつい押しますし、これすげー困りますよ。

それでちょっと検索してみると、

といったように、どうやらうちの研究室固有の問題ではないということに気づきました。こまったこまった。

ということを Facebook に書いたら、学生時代の研究室の先輩方に「おまえまだ tcsh 使ってんのかよはやく zsh にしろよ」といわれまして、つい乗り換えてしまったのですが、root とかはデフォルトの csh のままなわけでして、難しい作業やってるときにシェルが死ぬと集中力きれて困るわけで。

それで、新しい端末をセットアップしていたときに、ports に nss-pam-ldapd というのが入っていることに気づいて、これを使ってみたら ctrl+c おしても平気。nss_ldap や pam_ldap の派生プロジェクトだそうです。

これにてどうやら解決です。めでたい。

OpenNTPd で行こう

サーバ関係はずっとFreeBSDで生きているわけですが、いまの職場に移ってきてすごく困ったことのひとつが、外部からのUDP/123が閉じられていること。FreeBSDとか、多くのUnix系OSに含まれているntp.org版のntpdでは、これだと外部のNTPサーバと同期することができません (学内のNTPサーバにも届かない…!)。
それで、いままでどうしていたかというと、ローカルのNTPサーバになるホストをntpdate -u で毎晩外部のNTPサーバと同期させて、あとはそのホストを参照していたわけですが、なぜか突然動かなくなりまして、ntpq -p しても、LOCAL(0) へのreachが0とかなんなの… という状態。ntpdがちゃんと動いているか、動いてないならなんでダメなのか、ログをいろいろあたっても全然わからず。
それで、とりあえずntpdでの外部のサーバへのアクセスがntpdate -u相当 (非特権ポートでのアクセス)になればいいんじゃないの、と思ったけれども、どうやらそれはできないようです。
解決策をいろいろ調べていたら、”openntpdならできるよ!” みたいな記事がちらほら。OpenSSH的に、OpenBSDのプロジェクトの一部として開発されているそうです。たしかに、ntp.orgなntpdはときどきセキュリティホールが見つかったりしてて、ドキドキすることもあるしなあ。OpenBSDらしく、シンプルに堅牢に、ということだそうで、設定ファイルは誰を参照してどのアドレス/ポートをListenするか、ということくらい(あと、何かセンサを持ってる人はそれも)。
マイクロ秒単位での正確性という面ではntp.orgの実装のほうが上だそうですが、うちは別にmakeがおかしくならなければいいよ、という程度なので、精度的には充分です。設定ファイルは簡単で、

listen *
server ntp1.hogehoge.org
server ntp2.hogehoge.org

みたいに書いただけで動きました (どうせ firewall でいろいろきってるので、listen * でOK)。超ステキ。ntpq -p 相当の、いまどこと同期がとれてるかは、

% ntpctl -s all

で見られます。見ていると、安定してきたら外部のサーバをpollingしにいく間隔も長くなるようですし、これはトラフィックの軽減というポイントからは非常にいいですね。
それから、当然NTP準拠なので、Macをはじめ、ローカルのNTPクライアントの設定はそのままで動きます。これからはこれでいこう。

Raspberry Pi 2 + FreeBSD 11 + X.org

ARMv6 な FreeBSD 11-CURRENT では FreeBSD の pkg の提供がはじまっており、べんりべんり。
Raspberry Pi 2 用の起動 SD カードイメージも配布されています。

pkg で xorg と xf86-driver-scfb いれたら X もあがりました。
ただ、auto negotiation 的ないろいろがないので、Xorg -configure みたいなのはできません。
モニタとの解像度などの negotiation は syscons がやってくれるので、scfb driver で X 動きます。
遅いんですが、まあなんとか使えるかな、という感じでもあります。本体のメモリがあんまりないので X 端末的な感じでしょうか。

というわけでこんな xorg.conf で動きました。

Section "Files"
EndSection
Section "Module"
  Load        "dbe"
  Disable    "dri"
  Disable    "dri2"
  Disable    "glx"

  SubSection  "extmod"
    Option  "omit xfree86-dga"
  EndSubSection
EndSection

Section "ServerFlags"
  Option    "AIGLX"        "false"
  Option    "NoAccel"    "True"
  Option    "NoDRI"        "True"
  Option    "DRI"        "False"
  Option    "DRI2"        "False"
EndSection

Section "InputDevice"
  Identifier  "Keyboard1"
  Driver      "kbd"
EndSection

Section "InputDevice"
  Identifier  "Mouse1"
  Driver      "mouse"
  Option      "Protocol"      "auto"
  Option      "Device"        "/dev/sysmouse"
EndSection

Section "Monitor"
  Identifier  "Monitor"
  Mode "1680x1050"
    DotClock        147.14
    HTimings        1680 1784 1968 2256
    VTimings        1050 1051 1054 1087
  EndMode
EndSection

Section "Device"
  Identifier  "Generic FB"
  Driver      "scfb"
  Option    "NoAccel"    "True"
EndSection

Section "Screen"
  Identifier  "Screen"
  Device      "Generic FB"
EndSection

Section "ServerLayout"
  Identifier  "layout"
  Screen      0 "Screen" 0 0
  InputDevice "Mouse1" "CorePointer"
  InputDevice "Keyboard1" "CoreKeyboard"
EndSection

ZYBOでFreeBSDその後

学期が始まってから急に忙しくなって、長らく作業が止まっていたのですが、ちょっと時間がとれたのでいくつかやってみたことがあります。わかったことのまとめ。
– PS の初期化 (CPU clockのPLLとか、PS側のI/Oの設定) は FSBL によって行われる。.bit ファイルではない。
– したがって、boot.bin に .bit ファイルを含めることは必ずしも必須ではない (ZYBOの場合はちがう: 後述)
– FSBL は前半で最低限の設定をし、PL が構成されたら後半の作業をする
– ZYBO の場合、この後半の作業で I2C ROM から MAC アドレスを読み出すが、I2C は PL 経由の EMIO に接続されているので、ここをつなぐ .bit ファイルがロードされていないと FSBL の途中で固まる。
– PS がびっくりしない程度の範囲で PL は起動後に書き換えてもよさそう。たとえば、Master AXI ポートの先の回路が変わるくらいはなんともない模様。ただ、Slave AXI ポートとか、ACP ポートはどうかな…
とりあえず、Master AXI の先に LED とスイッチつないで、/dev/mem を mmap したところ、スイッチの値は読み出せましたが、LED は全然だめで、おそらくこれはキャッシュか何かが悪さをしているのだと思います。
FreeBSD/ARM の /dev/mem はまだ buggy なようで、キャッシュしちゃったりするようです。memcontrol も使えないし、まあ、そのあたりの実装がまだちゃんとできていない、ということなのでしょう。なので、AXI なモジュールつくったら、デバイスドライバ書かないといけない感じですね。というわけで、適当なドライバを書いたあたりで、また記事を書くことにしましょう。