srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

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

ブレゼンハムアルゴリズム

与えられた始点と終点の間に連続した点を置き、近似的な直線を引くためのアルゴリズムである。y = ax + b を近似する場合、ある整数 x に対して、y の値を計算し、その値を四捨五入して整数値にした値を近似値とすればよい。 この操作を始点から終点までのす…

pthreadによるスレッド間でのカウンタの共有

まず以下のプログラムのように、変数xを複数のスレッドが共有し、それぞれのスレッドがCOUNT_NUM回、変数xをインクリメントする処理を行う。 あるスレッドが(*(int *)i) += 1を実行する間に、他のスレッドも同じ部分を実行すると、競合が起こり、最終的に変…

store to load forwarding

あるメモリアドレスに書き込む命令の後に同じアドレスから読み込む命令が続くとき, store forwarding が行われる. mov DWORD [esi], edi mov eax, DWORD [esi] 上の例だと1行の書き込みが実際にL1$に書き込む前に, Store Bufferに書き込まれ, 読み込む命令は…

main()の前後で関数を呼び出す

GCCの拡張機能を使って行っています. #include <stdio.h> __attribute__((constructor)) void foo() { printf("hello, before main\n"); } __attribute__((destructor)) void bar() { printf("hello, after main\n"); } int main(int argc, char const *argv[]) { pri</stdio.h>…

CPUキャッシュの最適化について

Non-blocking Cache キャッシュメモリの構成法の一つであり, キャッシュミスが起こり, それが処理されている最中でも, cache アクセスを可能にする. さらにメモリレベルの並列性(Memory-level parallelism) を使用することで, 同時に複数のキャッシュミスを…

自己書き換えコード(self-modifying code)

自己書き換えコードとは, 実行時に自分自身の命令を書き換えるコードのことである. 以下のコードでは, foo() 関数の i++ の命令を i += 2に自己書き換えしている. 順に説明していくと, まず mprotect() 関数でfoo関数の命令が書かれているページに読み, 書き…

Intel Pin の使い方

DBI

Dynamic Binary Instrumentation (DBI) は実行時にバイナリに命令を挿入することによって, プログラムの実行トレースから情報を取り出す技術であり, それを用いたツールの一つである Intel Pin を使っていく. 以下で簡単に使っていく手順をメモしていく. 公…