外房Linux生活

2024年1月6日土曜日

VirtualBoxのVMでllama.cppをビルドする

Ryzen 5 3600を搭載したPC上のVirtualBoxのVMで、llama.cppをビルドしようとしたら、次のようなエラーが出た。

In file included from /usr/lib/gcc/x86_64-linux-gnu/11/include/immintrin.h:99,
                 from ggml-impl.h:75,
                 from ggml-quants.h:3,
                 from ggml-quants.c:1:
ggml-quants.c: In function ‘ggml_vec_dot_q4_0_q8_0’:
/usr/lib/gcc/x86_64-linux-gnu/11/include/fmaintrin.h:63:1: error: inlining failed in call to ‘always_inline’ ‘_mm256_fmadd_ps’: target specific option mismatch
   63 | _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C)
      | ^~~~~~~~~~~~~~~
ggml-quants.c:2516:15: note: called from here
 2516 |         acc = _mm256_fmadd_ps( d, q, acc );
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/11/include/immintrin.h:99,
                 from ggml-impl.h:75,
                 from ggml-quants.h:3,
                 from ggml-quants.c:1:

Makefileで指定されている最適化オプションの「-march=native」がうまく働いていないのが原因のようなので、単純にそれを削除することでビルドできた。高速化させるなら、cpuflagsを見ながら「-mavx」などを追加するとOK。

2017年10月25日水曜日

hpsaドライバとmegaraid_sasドライバの改造

現在、自宅のファイルサーバーではHighPoint RocketRAID 2680 SGLというSAS RAIDカードをHBAとして使ってZFSストレージプールを作成しているのだが、こいつのドライバはLinuxカーネルに正式に取り込まれておらず、ちょっとした調整をしないと今時の環境では使えない。調整の情報はUbuntu Forumなどにあって、その通りにすれば動くのだが、高負荷時にビープ音が出て停止したり、SATAが最高3Gbpsまでだったりと、少し不満がある。

そこで最近、オークションで富士通のPG-248H(D2616)というSAS RAIDカードを(安く)入手した。こいつに入れ替えればバッチリ!…と思いきや、こいつは物理ドライブをOSにそのまま見せるモードに対応していなかったのである。このカードに限らず、LSI SAS 2108搭載のものは皆そうらしい。LSI SAS 2008の場合はITモードのファームウエアを書き込むことでHBAとして利用可能になるらしいが、こっちはそれもできない。

面倒臭かったので別製品(HP Smart Array P410)をまたオークションで入手したのだが、動かしてみると、なんとこっちも物理ドライブをOSに見せられないことが判明。しかもこっちはSASは6GbpsだがSATAは3Gbpsまでだった(笑)

ただググったところ、Hewlett-Packard P400 physical drive access and >2TB drivesというページを発見した。同ページによると、通常はドライバ側でマスクしている物理ドライブをマスクしないようにhpsaドライバを改造すればいいらしい。Ubuntu 16.04のカーネル(4.4系)では、同ページのパッチが使えないので以下のようなものを作成して試してみたところ、特に問題なく動作しているようだ。本当にこれでいいのか少し不安だが、動けば良かろうなのだ。

hpsaドライバのパッチ(4.4系向け)

--- hpsa.c.orig 2017-10-25 17:56:54.702177019 +0900
+++ hpsa.c      2017-10-23 21:26:06.729861753 +0900
@@ -89,6 +89,10 @@
 module_param(hpsa_simple_mode, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(hpsa_simple_mode,
        "Use 'simple mode' rather than 'performant mode'");
+static int hpsa_expose_masked;
+module_param(hpsa_expose_masked, int, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(hpsa_expose_masked,
+       "Expose masked physical devices (cf. BSD hw.ciss.expose_hidden_physical)");

 /* define the PCI info for the cards we can control */
 static const struct pci_device_id hpsa_pci_device_id[] = {
@@ -4101,7 +4105,7 @@
                if (!tmpdevice->external && physical_device) {
                        skip_device = hpsa_skip_device(h, lunaddrbytes,
                                        &physdev_list->LUN[phys_dev_index]);
-                       if (skip_device)
+                       if (!hpsa_expose_masked && skip_device)
                                continue;
                }

@@ -4148,7 +4152,7 @@
                 * Expose all devices except for physical devices that
                 * are masked.
                 */
-               if (MASKED_DEVICE(lunaddrbytes) && this_device->physical_device)
+               if ((MASKED_DEVICE(lunaddrbytes) && this_device->physical_device) && !hpsa_expose_masked)
                        this_device->expose_device = 0;
                else
                        this_device->expose_device = 1;


調子に乗って、PG-248H用のmegaraid_sasドライバも同様の改良が出来ないかとソースを見たところ、こっちはmegaraid_sas.hの定数を1つ書き換えて、物理ドライブの「Unconfigured Goodステータスを「System」ステータスとして取り扱うようにすれば良さそうだと分かった。試したところ、こちらも動作は問題なさそうだ。

megaraid_sasドライバのパッチ(4.4系向け)

--- megaraid_sas.h.orig 2017-10-25 18:02:27.276084072 +0900
+++ megaraid_sas.h      2017-10-25 18:01:44.246440683 +0900
@@ -431,7 +431,7 @@
        MR_PD_STATE_REBUILD             = 0x14,
        MR_PD_STATE_ONLINE              = 0x18,
        MR_PD_STATE_COPYBACK            = 0x20,
-       MR_PD_STATE_SYSTEM              = 0x40,
+       MR_PD_STATE_SYSTEM              = 0x00,
  };

2012年6月2日土曜日

LCDサイズより大きなデスクトップを表示

現在使っているノートPCの画面サイズは1366x768。普段使う分にはそんなに不満はないのですが、A4サイズのPDF文書を読みながら会議するような場合には表示領域の狭さを感じます。

panningを設定して、いわゆる仮想デスクトップ領域を広くすればある程度解決するのですが、これをやると、ツールバーなどが仮想デスクトップ領域全体を対象に作成されるので操作性に若干問題が生じます。

こういう時に便利なのが、xrandrのscaleオプションを使った縮小表示(圧縮表示)です。これを使えば、LCDの画素数以上のデスクトップ画面を簡単に表示できます。縮小表示しても文字なんかは結構読めちゃうのでお勧めです。たとえば、デスクトップ画面を1640x922にするには、次のようにコマンドを実行します。
xrandr --output LVDS-1 --scale 1.2x1.2 --panning 1640x922 --fb 1640x922

それで自分の環境でもやってみようと昨晩試したのですが、ハードルが2つありました。一つは、NVIDIAのドライバではscale操作が効かないこと。これは、nouveauに切り替えることで問題は解消します。Fedora 16だとnouveauではGNOME 3はクラシカル表示になっちゃいますが、Fedora 17にすれば大丈夫でした。

もう一つの問題は、画面サイズは問題なく拡大できるのにマウスポインタの移動範囲が、従来の1366x768のままになってしまうこと。これはXサーバーのバグで、Fedora 17で採用されているバージョン1.12でも解消されていません。Chris Bagwellという方が修正方法を調べてくれているので、Xサーバーのソースパッケージを入手して、その通りに手パッチを当てます。パッケージをビルドしてインストールすることで、この問題も解消されました。何だかんだで一晩かかっちゃいましたよ。

2012年4月25日水曜日

zfs-fuseの利用にはライセンス上問題がある…らしい


最近気づいたのだが、有名なkinnekoさんにdisられていたようだ。直接、私の記事に宛てたものではないけれど、私の書いた記事内容をベースにした(記者さんの)記事宛なので同じことだろう。zfs-fuseの利用にはライセンス上の問題はないと理解していたのだが、どうやらそれは間違っていたようだ。

ライセンス上問題のあるものを堂々と記事にするというのは、日経はかなりダメだと思いますねBSDで使えばいいじゃないの。

と明言されている。うーむ。困った。かなり調べてみたのだが、どの辺にライセンス上の問題があるのか分からなかった。FUSEのコードにはLGPL部分とGPL部分があって、ファイルシステムのコードはLGPL部分にしか依存しないから、いわゆるGPL汚染が生じないと理解していた。しかしそれは間違いで、GPL部分との分離が上手く行っていないという話なのだと思う。私だけでなく、世間的に「zfs-fuseならOK」という誤解が広まっているので、どの箇所に問題があるかをご指摘くださると幸いだ。ライセンス違反があるというご指摘にはニュース性があるので、記事にして誤解を解くこともできると考えている。

2012年3月26日月曜日

AMDチップセットのWatchdogタイマー

日経Linux 2012年5月号の連載記事でWatchdogタイマーを取り上げました。その記事を書くにあたっていろいろ調べた際に気になったのが、AMDチップセット向けのWatchdogタイマードライバ「sp5100_tco」のこと。このドライバはカーネル2.6.38でマージされたのですが、以下の理由から、少なくともカーネル3.3までのものは使用できないことが多いんじゃないかなと思います。

使用できない最初の理由がI/Oメモリーのバッティングです。SP5100/SB700/SB800/SB900では、Watchdogタイマー用のI/Oメモリーとして「0xfec000f0-0xfec000f7」を使用するのですが、これはIOAPIC用に確保する「0xfec00000-0xfec003ff」の範囲内にあるため、ドライバ読み込み時に次のようなエラーが出て正常稼働しません。

SP5100 TCO timer: mmio address 0xfec000f0 already in use

この問題を解消するには、IOAPIC用に確保するI/Oメモリー範囲を小さくしてやる必要があります。具体的には、カーネルソースのarch/x86/include/asm/apicdef.hファイル中にある「IO_APIC_SLOT_SIZE」という定数を1024から128に減らしてカーネルを再構築します。そんなことして大丈夫かと思いますが、とりあえず問題ないみたいです(lkmlの関連スレッド)。

使用できないもう一つの理由がSB800以降に未対応なことです。SB800以降ではレジスタ構成が変化していますが、sp5100_tcoドライバでは現在のところこれが考慮されていません。つまりSP5100/SB700専用なわけです。にもかかわらず、SB800/900環境でもこいつが読み込まれてしまいます。SB800のリファレンスを見ながら改造版の「sp5100_tco.h」「sp5100_tco.c」をでっち上げたところ、一応、SB950環境で動作するようになりました(他は未確認)。しかしこちらはSB800/900専用でSP5100/SB700では動作しませんのでご注意を。どなたかちゃんとした統合ドライバを作って、mainlineカーネルにマージしてほしいものです。

(2012/11/10 追記)
Takahisa Tanakaさんがパッチを作成してmainlineへのマージ活動をされているようです(カーネルのbugzilla)。8月以降作業が中断しているっぽいですが大筋では良い感じで進んでいるようで、あとひと押しでマージされそうな印象を受けました。私の改造ドライバよりもそちらで開発されているパッチの方が(当然ながら)まともですので、そちらを使われることをお勧めします。パッチはbugzillaのページから入手できます。

2012年2月18日土曜日

ECCメモリー購入

Bulldozerマシンを組んだ」で書いた通り、昨年末にSATA 3.0機器検証用にFX-4100+GA-970A-D3構成のマシンを組んだ。せっかくのBulldozerマシンなので、こいつをメインのLinux機にして仮想化機能などをあれこれ試したい。となるとメモリーは沢山積みたいが、non-ECCだと大量のメモリーを載せるのはなんか怖い気がする。幸いなことに、Bulldozer内蔵のメモリーコントローラはECC対応だし、どうやらGA-970A-D3も非公式ながらECC対応しているらしい。


というわけで久しぶりにECC対応メモリーの値段を調べた。non-ECCに比べると高いが、昔に比べると驚くぐらい安くなっていて嬉しい限り。その中でも、SanMaxの「SMD-16G68EHP-13H」(DDR3-1333 4GB)の4枚セットが1万1580円とコスパが良かったので、それを購入した。うまく動くといいが(追記:何の問題も無く動作しました。ECC有効無効はBIOSで設定可能)。

2012年1月4日水曜日

Fedora 15/16でESSIDステルスAPに接続する方法

テストマシンにFedora 16を入れて無線LAN接続させようとしたら、NetworkManagerのGNOME3アプレットにESSIDステルス機能を有効にしたアクセスポイント接続用の設定項目が無いことに気づいた。あれ、この問題ってまだ修正されていないんだっけ?


とりあえず、Red HatのBugzillaで紹介されている以下のコマンドを実行すれば設定ダイアログが表示されて接続できるようになりますが、ちょいと不便ですね。より美しい解決策を模索されているのでしょうが、それが実現できるまでは、一時しのぎでいいのでボタンを一つ追加して欲しかったりします。


gdbus call --session --dest org.gnome.network_manager_applet --object-path /org/gnome/network_manager_applet --method org.gnome.network_manager_applet.ConnectToHiddenNetwork

すいません、大ボケかましてました。Bugzillaのツリーを最後まで読んだら、ネットワーク設定画面のネットワーク名選択のプルダウンメニューで「その他...」を選べばいいよ、としっかり書いてありました。「ネットワーク名」の文字が薄く表示されていることで、選択不可能な項目かと思い込んでいましたよ。Fedora 15/16のどっちもこれで行けますね。お騒がせしました。