2021年3月11日木曜日

小ネタ

「不動産大手が有人宇宙開発(宇宙ステーション)に参入」から漂う「ハウルの動く城」感。月面有人宇宙開発なら不動産の可能性もあるけど、やっぱり軌道運動してるから動産。そんな事言い始めたら地上の建築物だって自転や公転があるわけで、すべての物体は動産という結論。

「動いているか」じゃなく「動かせるか」が問題だとすると、レゴリスでブロック作って凍らせた城は不動産だろうけど、宇宙ステーションレベルだと結構微妙。リブーストとか考えれば自前で推進系を持っているだろうけど、「実用的に(軌道傾斜角等を)動かせるか」というとほぼ不可能だろうし。ま、ISSがアホみたいにデカイだけで、CrewDragonにインフレータブルつけた程度の滞在施設であれば十分動産とみなせそうだけど。ってーことは不動産屋が扱う代物じゃないじゃん。月の南極で築城はよ!!

***

 物質や環境の分野で使われるマイケルソン干渉計って、コムフィルタっぽいな、と思う今日このごろ。マイケルソン干渉計で白色光を干渉するとSincみたいなのが出てきて、検出器からの信号をFFTに通すとスペクトルが得られる。干渉計自体はフーリエ変換というかフーリエ逆変換を担当してるっぽい。

 ピエゾ素子で鏡動かすとか聞くと電子工作レベルでできそうな気配が漂うけど、とはいえ光の波長レベルの話だからなぁ。実際に使われてるのがあれだけ大規模なものってことは、光学実験機器のレベルとしても相当大変なモノのはず。

***

 .NET CoreのVector<T>、ベクトル(複素平面とか)ではなく、スカラを複数個持っている型、なのか。名前どーにかしろよ、という気が。。。C++のVectorに合わせたのかな。スカラの四則演算はまとめてできるので早そうだけど、ベクトル演算をやりたいときは困りそう。2次元ベクトルのクロス積とかどうやって計算するんだ? Cortex-M4のSIMDだと2次元ベクトルのクロス積を計算する命令(16bit整数専用)、みたいなのがあったような気がするけど、Vector<T>にはそういう便利機能はなさそう。結局ゴリゴリの数値計算やるならC++使え、GPU使え、みたいな流れになるんだろうか。

 一応、unsafeとかポインタとかでゴリ押ししてデータ並べ替えてやれば、Vector<T>の和差積で2次元のクロス積も計算できるだろうけど、結局並べ替えにかなりのリソース食われるので、それやるくらいなら直接計算させたほうが早い気がする。


 念の為にunsafeでゴリ押しするタイプの処理を作ってみた。ビット幅の違いがあるとはいえ、普通に積を取る自作ライブラリより2割弱早くなる。大量に変数の移動を行っても、SIMD使うほうが少し早い。ちなみに、試しに同じ計算をSystem.Numerics.Complex(doubleベース)でやってみたところ、自作ライブラリの4倍以上早くなった。やっぱりハードウェアでゴリ押しはつよい(小並感

 とはいえ、正直、もうちょっと差出るかな、と思ってたのも事実。2次元ベクトルの積、スカラの積が4回に加算が2回(和差が1回ずつ)なので、1命令で処理できれば単純計算で6倍は出るはず。そうならないってことは、パイプラインで和と積が同時に流れてるとか、そういう部分で多少早くなってるんだろう。

 System.Nmerics.ComplexとMathNet.Numerics.Complex32を比べると、わずかにComplex32のほうが遅い。1個ずつの計算ならdoubleでも1発で計算できるということかな。

 演算子のオーバーロードと静的関数呼び出しだと、Complex/Complex32共に1-3%程度の改善。割合としてはあんまり大きくないなぁ。使わないよりはマシ、程度。


 とりあえず、一番重い処理が4倍早くなるんだから全体的にだいぶ早くなるだろ、と思って、Complex32で計算。してみたものの、3割弱くらいしか改善しない。解せぬ。テストに使ったのは.NET Core、ダウンサンプリングで使ってるのは.NET FWなので、FWだとSIMD効かない? というかDocsでもSIMDが使える例にVectorとかMatrixとかQuaternionは入っているけど、Complexは入っていない。じゃぁなんでCoreだと早かったんだ、という疑問があるけど。もしかして、ソフトウェアで計算しても自前のライブラリの4倍早いってこと? んで、重いと思ってた場所が4倍早くなっても15%しか早くならないということは、他の場所でものすごい負荷がある? うーん、最適化むずかしい。。。

 CICのタップ数増やしても、処理時間が激増、というほどではない。やっぱりCICに入れる前で計算量食われてそう。CICで落としたあとのFIRがヤバい可能性もあるけど。まぁ、全体的に重いんだろうなぁ。


 そーいえば、.NET CoreだとAVX2とか使えるんか。そっちでゴリゴリやるのも一興……? AVX2で浮動小数点のサポートも増えたようだけど、2では256幅の整数演算とかが得意らしい。ということは、shortなら16個を並べられるので、2次元ベクトルなら8個を同時に計算できる。ほんとかなぁ。まぁ、試してみねば。どーせSIMDなんてCortex-M4と変わんねーだろ、よゆーよゆー(盛大なフラグを建築することで逆説的にフラグを折る作戦)

***

 3月10日受信分

* 27844 / CUTE-1

* 32785 / CUTE-1.7+APD II

* 32791 / SEEDS

* 33493 / PRISM (HITOMI)

* 35932 / SWISSCUBE

* 41340 / HORYU 4

* 41460 / AAUSAT 4

* 42775 / AALTO 1

* 42790 / VZLUSAT 1

* 43615 / CP-7 DAVE

* 43743 / REKATOR HELLO WORLD

* 43933 / ORIGAMISAT-1

* 43937 / NEXUS

* 44330 / RAAVANA1

0 件のコメント:

コメントを投稿