2018-01-01から1年間の記事一覧

makeの並列オプションは何を指定するべきか

最近何の縁があってか 鬼斬弐 というオープンソースのプロセッサシミュレータの開発を手伝っています。 github.com ここ数日でRISC-VのRV64Gへの対応が急速に進められ、ベンチマークプログラムも動くものが増えてきたようです。 私はちまちま細かいバグを取…

RISC-Vのシミュレーション環境を構築した

そろそろクリスマスですね。ltmpcを作ってからもう一年たってしまったのかという思いでいっぱいです。 github.com さて、前回作ったRISC-V用のgccですが、残念ながら手元にRISC-Vの命令セットが動くコンピュータがないため、コンパイルしたプログラムを動か…

gcc8.2.0をソースからビルドした

環境構築がうまくいかないとつらいものです。うまくいったという情報がweb上にあるだけで助かったりします。 うまくいったので記録に残しておきます。 gcc8.2.0, x86向け 制約 管理者ではないので/bin/とかそういうところにはインストールできません。/home/…

CPUの浮動小数点演算性能やクロック周波数を測定する

CPUのカタログスペックはメーカーが公表しているので、それを参照することもできますが、本当にそうなのか確かめてみるという話です。 最近のIntelのCPUしか持っていないので、それでしか確かめていないませんが、四種類のCPUで試してみました。 CPUのクロッ…

わりざんするアルゴリズム(その2.5)

三週間前の記事(わりざんするアルゴリズム(その2) - よーる)の割り算する回路・アルゴリズムを改良する話です。 わりざんするアルゴリズム(その1) - よーるとわりざんするアルゴリズム(その2) - よーるで紹介した方法は、商と剰余を求めるのに常に整数型の…

きょうでおしまい

さいごまでなおらなかったね でもせっかくだからいろんなのをやって、七年間がこんな楽しい形で終われてよかった

ビット行列の行列積高速化に関するメモ

行列の要素が0 or 1であり、加法がbit or、乗法がbit andであるような束(加法がxorではないので、ブール環にはなっていません。また、束であることは特に使いません)上での行列積演算を考えます。 これが疎行列、つまり行列の成分がほとんど零であり、非零…

わりざんするアルゴリズム(その2)

先週の記事(わりざんするアルゴリズム(その1) - よーる)に引き続き、割り算する回路・アルゴリズムの話です。 非回復法(non-restoring division) 回復法の場合、「計算してみて、その結果に応じて……」という、ある意味試行錯誤に近いアルゴリズムでした。 …

わりざんするアルゴリズム(その1)

なんか最近割り算する回路を書いていろいろ知ったのでまとめていきます。 以下、割り算とは以下のものをさすことにします。 商と余りを両方求める 符号付きの場合、商はゼロへ丸め、余りは被除数と同じ符号とする 2は、数学的な定義とは異なります。C99で定…

半端なbit長の、固定幅の整数型

C99/C++11で追加された、固定幅の整数型(uint8_tやint32_tのようなものたち)は特定のビット幅で計算したいときに大変便利です。何ビットの整数が要求されているかを明示することで移植性が高まります。 また、uint16_tは必ずオーバーフローせず、結果の上…

invSqrtをニュートン・ラフソン法で求める方法の性質

先週は平方根関数をライブラリとして実装する方法をひとつ紹介しました。その方法は、デフォルトの丸めモード(最近接丸め)では正しく動作しますが、方向丸めの場合にはうまくいかないことが判明しました。 その中で、逆数平方根をニュートン・ラフソン法で…

IEEE浮動小数点数における平方根演算の精度に関する覚書

IEEE浮動小数点数における演算では、丸め誤差が不可避です。特に、複数回の演算を繰り返すと丸め誤差が積もっていき、正確な値と大きく離れた答えを得てしまうことがあります。しかし、次の演算については、(数学的に)正確な値を求めた後、一回だけの丸め…

bit列のパターンマッチング分解を行う方法

先週の話題 bit列のマッチングを行う方法 - よーる に引き続き、bit列操作の可読性を上げようという試みです。 パターンマッチを行い、特定のパターンに合致したと判明した時、残りの部分を(そのパターン特有の方法で)分解することは、特に関数型言語にお…

bit列のマッチングを行う方法

bit列操作のような低級なことをやっていると、bit列に対してマッチングを行いたいことがあります。 たとえば、以下のような例です。 t=0b11011010はpattern=0b11xx1010にマッチするか?→マッチする。 このようなことを行うためには、pattern中に出現するxを0…

std::pairをmemcpyすることについて

g++-8で追加された-Wclass-memaccessの警告を有効にしている場合、以下のコードはコンパイル時に警告が出ます。-Wclass-memaccessの警告は、-Wallに含まれるため、単にコンパイラをg++-8に変更しただけでこの警告に出くわすこともあると思います。 #include <utility></utility>…

パック展開でリスト操作

先週はパック展開を使うとconstexpr関数が高速化するみたいなことを書きましたが、具体的な使い方をあまり書けなかったので、具体例を書いておきます。 map template<class T, std::size_t N, std::size_t... Indeces> constexpr auto map_f_impl( const T (&arr)[N], std::index_sequence<Indeces...> ) { return std::ar</indeces...></class>…

constexpr関数を高速化する方法

constexpr関数ではほとんど何でもできてしまうので、可読性を損なうことなく多くの仕事をコンパイル時にこなすことができます。しかし多くのC++コンパイラでは、インタプリタ上で実行する実装となっており、非常に低速です。constexprで多くのことをやりたい…

ノートパソコンが二台いっぺんに起動しなくなってびっくりした

WindowsUpdateしたからなのか使っているノートパソコンが二台いっぺんに起動しなくなってびっくりしました。 他の同じ症状で困っているのが助かればと思って症状と直した手順を書いておきます。 Lenovo Miix 720 症状 電源ボタンを押すといつも通りLenovoの…

マクロレス型安全printf

もうみんなconstexprに飽きてしまったのか、ほとんど文献がないのでメモ程度に。 私が考えたわけではなく、 constexpr で テンプレートメタプログラミング - TXT.TXT に書いてあったことを試してみたというだけです。 紹介する実装は、コンセプトの確認にと…

知識なしでMastodonを改造する

先週の記事でも言ったけれど、私はこの分野の知識はほぼゼロなので、余り役には立たないかも。 Mastodonはオープンソースです。オープンソースのよいところはいろいろありますが、そのうちの一つに「気に入らなければ勝手に改造できる」というのがあります。…

知識ゼロからマストドンインスタンスを立てた

自分用にマストドンインスタンスを立てました。→ https://radon.lpha-z.net いろいろとさびしいので、遊びに来てくれるとうれしいです。 Twitterの方を動かさなくなるというわけではないです。 さて、マストドンインスタンスを立てたい誰かの助けになればと…

「レズと青い鳥」を読んだ

「レズと青い鳥」というのは、mikutterの薄い本制作委員会が今回の夏コミで頒布していた同人誌のこと。 brsywe.hatenadiary.com 今日は私がTwitterに登録してちょうど6年らしい。 通販されるのだしわざわざ買いに行かなくてもいいかな、と思っていたのだけれ…

C++で安全に絶対値を求める

C++で安全に絶対値を求める方法について、調べても出てこないので書いておきます。 安全に、というのは「オーバーフローなどの未定義動作を起こさず」という意味です。 #include <type_traits> #include <cstdint> template<class T, class U = std::make_unsigned_t<T>> U SafeAbs( T x ) { return x < 0 ? -static_cast<uintmax_t>(x) : </uintmax_t></class></cstdint></type_traits>…

constexprで書けない純粋な関数

今週はThe continuing evolution of C++の講演を聞いてきました。C++20では concept module contract を入れるというような話もしていました。どれもよい機能です。conceptは入ったらいいと皆が思うからこそ、微妙な点で意見が食い違ってなかなか入らないの…

ISAシミュレータを書くのを楽するためにTMPを使う方法

半年くらいブログをほったらかしにしていました。おひさしぶりです。 ついったーにC++のコードを張り付けていても検索性が低いなぁと思ったので今後はブログにまとめていこうかなぁという感じです。 ISAシミュレータを作るとき、一つ一つの命令の定義は非常…

ltmpc: CodeEmitterの解説

CodeEmitterでは、これまでで得られた型付きの抽象構文木と配置情報をもとに、x86(32bit)のアセンブリを出力します。 ターゲットとしてx86(32bit)を選んだ理由は、私が最も慣れ親しんでおり、呼び出し規約も簡単だからです。 CodeEmitterのコードは、ほんと…

ltmpc: Locationの解説

Locationでは、グローバル変数・自動変数・文字列定数の割り付けを行っています。 このコードを書き始めたのは完成の前日で、あわてて書いていたのでコードが適当になってきています。 FrameEnvironment フレームというか、中かっこ文ごとの、「今のSPがBPか…

ltmpc: TypeAnalysisの解説

TypeAnalysisでは、各部分式に型をつけていきます。また、制御構文により暗に生成されるラベルの生成も行っています(ここでやる必要はなかったですね……)。 もうこの辺では空間計算量を気にする余裕がなくなってきていたので、全部愚直な線形再帰で処理して…

ltmpc:Parserの解説

Parserは、LR(1)法もどきの手法によりトークン列を抽象構文木に変換しています。 まずは、LR(1)法のおさらいからします。 LR(1)法 LR(1)法を使うと、(文法を適切に書いたとき)あらゆる決定性文脈自由言語を認識することができることが知られています。 ま…

ltmpc: LexerとPreLexerについての解説

この二つのプログラムでは、ltmpcへの入力文字列をトークン列に切り分けることを行っています。 トークン列への切り分けは、前から順に行っていくのではなく、(疑似的な)並列処理を行いマージしていく、という普通ではない方法を使っています。 なぜこのよう…