2021年3月14日日曜日

小ネタ

 初音ミクのペーパークラフトがあったので作ってみた。

 3月9日ミクの日に滑り込みで……アウトだなぁ。

 「初音ミク あみぐるジャンプ」本日リリース! – クリプトン・モバイルコンテンツチームBlog

 ペーパークラフト作るの久しぶりでちょっと苦戦。いまいち精度良く作れなかった。ツインテの向きちょっとおかしい気がするので、間違って作ってるかも。

***

 JEM放出のキューブサット、437.0MHz周辺で出すやつも結構数あるので、25544相手に受信してみるのもアリかな。いくつかはVHFで出すようだけど、ウチの設備、VHFの受信実績が皆無なので、たぶんダイポールもそのあたりには感度は無いと思われ。八木はUFH専用だし。複数機同時受信体制は作れていないけど、とりあえず受信するだけ受信しておけば後でどうにかできるし。

***

 C#で使えるSIMD命令、世代ごとに一覧ページが分かれてて探すのが面倒。最新のAvx2はそれ以前のすべてを継承しているので、Avx2のメソッド一覧を取れば全世代の一覧が作れる。ということで一覧を作ってみたのだが、1200個って、馬鹿じゃねぇの!? なんでそんなに大量にあるんだよ!! それでもまだ足りないってどういうことだよ。。。あげくCPUによって使える命令に差があるとか、そりゃSIMDなんてメンテしてられませんわ。そんなもんにリソース割くよりクロック上げてコア増やせよ、って話にもなるわなぁ。


 shortを入れ替える方法を見つけた。AVX2の_mm256_shufflelo_epi16と_mm256_shufflehi_epi16。256bitの上下128bitそれぞれを、64bit境界内で動かせる。Shuffleのクセがあるので自由に動かすのはつらいけど、隣接2個を入れ替える今回の用途なら十分。

 ということで、byte[]とsbyte[,]を突っ込んでクロス積をshort[,]に出す関数を作った。第1引数は生データから読み込んだDCオフセット付きのbyte配列を直接渡す想定。第2引数はせいぜい振幅16とか32くらいの正弦波を入れるだけなので、sbyteで実装。shortと比べて若干(3%程度)早くなる。計算自体は16bitで行うので、sbyteで渡しても読み込む際に16bitへ変換するので、命令セット的にはsbyte渡しだとレイテンシが大きくなる。shortだと右から左へ無加工で流せる分レイテンシが少なくて済む。sbyte渡しが若干とはいえ常に早くなるのは、メモリ帯域幅とかの影響と思われ。

 ちなみに、byte/sbyteとbyte/short共にComplex32と比較して同じ計算結果が得られていることを確認している。byte/sbyteとComplex32を比較すると、6倍前後の速度差が得られる。まぁ、この処理は元々それほど重い処理じゃないので、効果は限定的だけども。。。まぁ、えらいひとも「最適化はやりたい人がやりたいようにやればいい」と言ってるしね。やり方が分かったのでやってみた、ということで。


 入力のbyte配列と連続波の積を必要最小限のSIMDで流せるようになったので、そのように後段もそれに合わせて改造。Complex32のクロス積の時が3分23秒、SIMD化で2分34秒、くらい。3割の高速化。予想以上に早くなった。

 CICの変数を、今まではCICクラスのメンバとして持っていたけど、メソッド内で一々コピーして、ローカルで持つように変更。ローカルと言っても毎回ヒープ確保してるわけだが。それで1分12秒まで短縮。一気に2倍以上も早くなってしまった。ローカルで宣言してコピーしてもヒープに持ってるのは変わらないわけで、全体のパフォーマンスで2倍も変わるほどとは思えないんだが。ここ数日、全く気にもとめてないところで大幅に計算量食ってるという事態が多発してるので、プログラムのパフォーマンス改善の手段はちゃんと調べてみたほうが良さそう。

 とにかく、9分ちょっとかかってた処理が1分ちょっとで終わるようになったので、だいぶ早くなったのは間違いない。現実的な処理時間でもCICの段数を増やせるので、より急峻なフィルタを作れる。それに、十分待てる範囲の待ち時間に収まってきたので、そろそろ他の部分にも手を付けたいところ。

***

 3月13日受信分

* 27844 / CUTE-1

* 27848 / XI-4

* 28895 / XI-5

* 32791 / SEEDS

* 33493 / PRISM (HITOMI)

* 41460 / AAUSAT 4

* 42775 / AALTO 1

* 42790 / VZLUSAT 1

* 42792 / ROBUSTA 1B

* 43615 / CP-7 DAVE

* 43743 / REAKTOR HELLO WORLD

* 43937 / NEXUS

* 44330 / RAAVANA1

 今日は体感だいぶ少なめだけど、機数的に言えばいつもどおり。例えば1機あたり1日に3回パスが有って、条件が良い日は2回のパスを強く受信できるけど、条件が悪い日は1回のパスしか十分に受信できない、という場合、いつもより3割多く捨ててるから、体感では少なくなるんだと思う。

0 件のコメント:

コメントを投稿