OpenCLCPUでもGPUでもないデバイスでOpenCLを動かすとしたらどうしたら良いでしょうか?答えとしては、その1で紹介したとおり、CL_DEVICE_TYPE_ACCELERATORを実装すれば良いです。イチから作るのはとっても大変です。素晴らしいことにpoclにはテンプレートらしき実装がpocl/lib/CL/devices/accelに用意されています。やりたいこととは微妙に違うことが後々わかりますが、イチから作るよりははるかにマシです。このテンプレートを改造しましょう。テンプレートの名前はaccelでいかにもアクセラレータに見えますが、デバイスタイプはCL_DEVICE_TYPE_ACCELERATORではなくCL_DEVICE_TYPE_CUSTOMです。CUSTOMは「コンパイルが可能なデバイス」ではなく、ビルトインカーネルのみを実行するデバイスです。ユーザー定義のカーネルを実行することは考えられていません。ユーザー定義カーネルが実行できることが独自アクセラレータの売りですから、何とかしてCUSTOMではなくACCELERATORになるように実装を改造する必要があります。これはなんとも先が長そうです......。11:57)コメント一覧コメントはありません。OpenCL独自アクセラレータのテンプレート実装pocl/lib/CL/devices/accelはデバイスタイプがCUSTOMになっているのが最大の難関ですが、その他にも色々問題があります。最初に遭遇する問題はデバイス数を取得する処理のエラー処理が間違っていることです。現状のコードだとちょっと特殊な環境変数を渡さないと動きません。dev_count;}このような実装になっておりaccelのデバイス数が42億(!)と解釈されてしまい、42億回デバイスを列挙しようとしてクラッシュします。バグのような気がしますけど、サンプル実装ですのであまり文句を言っても仕方ありません。ようにデバイス数を明示的に渡せば回避可能です。正しくデバイス数を返すような実装を追加する必要があるでしょうが、この場は環境変数で切り抜けます。11:58)コメント一覧コメントはありません。OpenCL引き続き、独自アクセラレータのテンプレート実装pocl/lib/CL/devices/accelの細かな問題を調べます。デバイス数の取得の問題を回避すると、次はデバイスのパラメータを渡す問題に遭遇します。環境変数の値をパースしてデバイスのパラメータを取得します。環境変数名はデバイス番号によって変化しますが、0番目のデバイスであればPOCL_ACCEL0_PARAMETERSという名前になります。してしまうので、環境変数には最低でも何か1つ数値を渡す必要があります。1つ目の値はレジスタ領域のベースアドレスだと解釈されるようです。他の実装(pthreadとcuda)は環境変数を使わないので、同様の問題は存在しません。最終的にはaccelも環境変数に頼らない実装に変えていく必要がありますが、今はそのままにしておきます。11:58)コメント一覧コメントはありません。Unleashedというボード、JTAGはちょっと特殊なコネクタが必要だと思っていて接続を諦めていました。JTAGも用意されていることに気づきました。Unmatchedも買った今となっては、かなり今更感ありますが......。$_TARGETNAME.4inithaltSiFiveのSoCはFU540も後継のFU740も命令セットの違うコアを混載するのが好きですね。混載は良いとしてせめて同じ命令セットにしてほしかったです。単純なSMPしか持ってないOSだと制御できないじゃん......。技術系の話はFacebookから転記しておくことにした。05:59)コメント一覧コメントはありません。Unleashedで動かしてみました。使うハードウェアはUARTだけ、コードもJTAGでITMにロードして動作させるだけなら楽勝だろと思いきや、全然UARTから文字が出力されず1日掛かってしまいました。hifive_unleashed!原因はコアのPLL設定が間違っていて、コアクロックから分周して作るUARTのボーレートもおかしな周波数になっていたからです。FU540のリセット直後は外部クロック源(33.33MHz)をそのまま使って動きます。999.9MHz)に設定し、コアクロックをPLL側に切り替えなければなりません。PLLの設定はFSBLという2段目のブートローダーが行うので、通常はOSが気にする必要はありません。RTOSは大抵ブートローダーを経由しませんから、ブートローダーに隠れた設定も拾ってきて実装しないと動かないことがあります。ブートローダーがあって当たり前のリッチ系SoCでRTOSを動かそうとすると、大抵この「暗黙のうちに設定されている何か」が抜け落ちて動かなかったりおかしくなったり、何かと面倒が起きます。幸いなことにSiFiveのブートローダーはコードが公開されており、完全ブラックボックスのSoCと比べれば、難易度は低い部類です。技術系の話はFacebookから転記しておくことにした。12:07)コメント一覧コメントはありません。LinuxTwitterでGUIの話をしている人を見かけて思い出した話です。GTKにして使っています。GUIにこだわりはなく一時期デフォルトだったLightDMを使い続けているだけです。左辺、上辺、右辺が1pxしか反応してくれないので、マウス操作が非常にシビアです。右マウスボタンでウインドウサイズを変えられるよ、と教えてもらいました。1pxに合わせるのは手が疲れる......。13:39)コメント一覧コメントはありません。OpenCL引き続き、独自アクセラレータのテンプレート実装pocl/lib/CL/devices/accelの細かな問題を調べます。次の問題はOpenCLの初期化です。呼ばれクラッシュします。メモリマップされたハードウェアのレジスタを読み書きしたいようです。/dev/memの代わりにバイナリファイルを開いてもらうように書き換えます。}...ファイル名を書き換えて突破するとデバイスが持っているメモリのサイズを取得し、メモリマップしようとする部分で怒られます。failed.サイズを取得している箇所は下記のとおりです。ように固定値を書いておくと次に進みます。今は実際のデバイスが相手ではないので、とりあえず先に進めて後で考えましょう。11:58)コメント一覧コメントはありません。RISC-V買い物メモです。Unmatchedを購入しました。SSDが装着できます。DigitalのWDS100T2B0C-ECを購入しました。Amazonで13,000円くらいでした。2280、接続NVMeです。Blueシリーズです。Blueで十分でしょう。15:21)コメント一覧コメントはありません。Outの最後の謎がわかりました。PWMのDuty比100%を維持したときに減衰する速度が異なります。3の回路図が間違っているのでは?と疑っていましたが、違いました。ケーブルに入っている抵抗のせいでした。抵抗入りケーブル今まで測定に使用していたオーディオケーブルにはプラグ内に抵抗が入っています。そもそもなんでこんなの買ったんだろ......?プラグの見た目からはわかりませんので、テスターで各端子間の抵抗を計測した結果は下記のとおりです。G---測定結果から想定される回路図です。左がミニジャック側、右がRCAプラグ側です。再度シミュレーションこの結果を踏まえてシミュレーションすると実測値とほぼ一致しました。Out、水色PWM信号125Hz矩形波)気づいてみれば何とも初歩的なミスでしたが、ケーブルは0Ωと思い込んで見落としました。他人(RasPiの回路図)を疑う前に自分を疑えという良い教訓ですね〜。01:09)コメント一覧コメントはありません。RISC-V関係の深いまとめリンク。LinuxSiFive社ボードの話、CoreMarkの話のまとめ。Jupiterが届いたその他の話のまとめ。23:29)コメント一覧コメントはありません。書籍通販のhontoがこんなキャンペーンをやっています。honto読書一生分プレゼントキャンペーンこのキャンペーン画像を見たときの率直な感想としては、どんな人間を想定したら、読書一生分がたった93万円に収まるのか?でした。マンガしか読んでない自分でさえ100万じゃ10年も持ちません。1世帯あたり読書にいくら使う?思い込みで文句を言うのは良くないなと思って、統計データを見ました。読書に関する支出(2018年)によると、1世帯、読書の支出が年間10,628円(電子書籍含まず)です。電子書籍を含む値段で考えたとしても、さほど変わりません。電子書籍を最も購入している30代(世帯主の年齢)でも1,736円で、読書支出は12,000円程度だからです。892,752円となり、hontoのキャンペーン金額と大体同じくらいになります。間違った数値でもなかった、ということですね。1人あたり読書にいくら使う?先程のデータを見ていて何が驚いたって、1世帯で1年間たった1万円しか本を買わないことです。この時点で少ないなと思うんですけど......。1世帯には複数人が生活していますので、1人あたりの支出も計算してみます。表番号7)を見ると、2015年で1世帯平均2.49人です。世帯あたり読書の支出は1年10,628円(書籍7,478円、雑誌3,150円)割ることの、日本の平均世帯人数2.49人(減少傾向)ですから、1人あたり1年で4,268円(書籍3,003円、雑誌1,265円)です。13,500円)をもれなく買うだけで3倍以上の支出になります。普段全く本は買わない、くらいじゃないと1年4,268円は厳しいです。世間の生活が想像できません......。13:22)コメント一覧コメントはありません。ALSAいつもわからなくなるのでメモしておきます。mplayerにてイコライザーを使う方法です。最近はmpvと呼ぶんですかね?コマンドはmpvを使いますが、実はイコライザー機能はffmpegの一部であるlibavfilter.soに頼っています(avfilterのドキュメントへのリンク)。この構造は一見しただけではわかりにくく、ヘルプを探すときに非常に難儀しました。設定方法も独特でいつも書き方がわからなくなります。イコライザーはsuperequalizerという名前です(superequalizerのドキュメントへのリンク)。18バンド指定できます。各バンドがどの周波数帯に対応するかはドキュメントを見てください。278s/9MB上記の例では、映像を出さない(--no-video)、音割れ防止の為にvolumeで8割くらいに音を下げる、superequalizerの18バンドを全て設定しています。superequalizer=1b=1.2:2b=1.5のようにすると特定のバンドだけ設定変更できます。便利な方を使ってください。4.3.2-0+deb11u2動作確認に使ったmpvのバージョンも記録しておきます。ffmpegやmpvはたまにインタフェースが激変するので、将来的に同じ方法が通用しなくなる可能性が高いからです。11相当みたいですね。UNKNOWNになっていて若干気になりますけど、特に害なさそうだから良いのかな......。14:10)コメント一覧コメントはありません。LLVMLLVMやClangは実行する方法が2つあります。1つ目はみなさまお馴染みのコマンドラインから実行する方法で、2つ目はプログラムからClangのライブラリを通して実行する方法です。後者のプログラムから実行する方法はGCCでは真似できませんから、LLVMならではの機能と言えるでしょう。インタフェースが不安定というか、バージョンによってちょいちょい変わって動かなくなるようで、そこは玉に瑕ですね。LLVMビルド&インストールClang/LLVMをプログラムから実行するにはいくつか準備が必要です。大まかに分けるとLLVMのビルド&インストールと、ヘッダおよびライブラリパスの指定です。ビルドは以前もチャレンジしました(2019年3月26日の日記参照)。基本的にはcmakeとmake(またはninja)です。それは変わりませんが、いくつか追加したいオプションがあるので再掲します。-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb"ざっくり意図を説明すると下記のとおりです。参照)を見てください。CMAKE_INSTALL_PREFIXインストール先を指定します。_installディレクトリにインストールする指定です。LLVM_TARGETS_TO_BUILD以前(2019年3月27日の日記参照)も使いましたが、特定ターゲットのみをビルドするオプションで、ビルド時間の短縮に繋がります。2つ以上指定する場合はセミコロンで繋ぎましょう。例ではx86とRISC-V向けにしていますが、お好きなアーキテクチャを足してください。LLVM_BUILD_LLVM_DYLIB全てのライブラリを1つのライブラリlibLLVM.soに集約するオプションです。興味があればこのオプションのON/OFFにより後述するllvm-configの出力がどう変化するか確認すると面白いかもしれません。LLVM_ENABLE_PROJECTSLLVMはLLVM以外にも多彩なツールを持っています。どのツールをビルドするか選択するオプションです。全ては必要ないですが少なくともclangは後で必要になります。例では全部入りにしています。installを呼びましょう。インストールまで進むはずです。Makefileの作成ヘッダインクルードパスの指定、ライブラリパスの指定のためにMakefileを書きます。パスの細かい値について心配する必要はありません。llvm-configというツールが用意されており、ほぼ全て自動的に用意してくれます。--xxxflagsとするとオプションに指定すべき文字列が出力されますから、素直に各種FLAGSに渡すだけです。何かオプションを追加するのも自由です。LIBSのところがちょっと格好悪いのは、llvm-configでlibclang-cppにリンクするような方法が見当たらなかったからです。良い方法をご存知の方は教えていただけると嬉しいです。