Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。
なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。
今回は第4章後半。NVIDIA以外のGPUの話と、最新のGPUの新機能の話。
Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。
なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。
今回は第4章前半。NVIDIA P100のザックリとした構造の概要。
GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)
Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。
なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。
今回は第3章。
(https://wccftech.com/review/intel-core-i7-6700k-skylake-k-cpu-review-asus-z170-pro-gaming/3/ より)
Rustのライブラリを使えばElfの解析だってできる。
バイナリファイルを読み込んで、HashMapにアドレスとデータの対を格納するプログラムを作成した。 各セクション毎にデータを読み込んで一つのHashMapにバイト単位でデータを書き込む。このモデルを作成すれば、Rustで簡単な命令セットシミュレータが作れるようになるはずだ。
training/program/rust/projects/sim_mem_elf/src/main.rs
fn memory_elf (elf_obj: goblin::elf::Elf, memory: &mut std::collections::HashMap<u64, u8>, buffer: &std::vec::Vec<u8>) -> error::Result<()> { let shdr_strtab = &elf_obj.shdr_strtab; for section in &elf_obj.section_headers { println!("elf_obj.section_headers = {:#?}, file_offset = {:#x}, size = {:#x}", &shdr_strtab[section.sh_name], section.sh_offset, section.sh_size ); if section.sh_size != 0 { for idx in 0..(section.sh_size-1) { let mut offset = idx + section.sh_offset; memory.insert(section.sh_addr + idx, buffer[offset as usize]); } } } Ok(()) }
$ cargo run ~/work/rocket-chip-msyksphinz/riscv-tools/riscv-tests/benchmarks/qsort.riscv
ただしまだRustとかScalaの初心者なので、MutableとかImmutableとか、まだ分かっていないことが多い。コンパイラの結果を見ながら進めている感じ。こんなので大丈夫かな?
Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。
なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。
今回は第2章。
GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)
Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。
なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。
一応、Jupyter Notebookでまとめを作っていく。画像などはコピーではなく、すべて自分で作成している。
これを最後までできるかな?頑張る。
GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)
RustのライブラリであるGoblinを使って、バイナリファイルを解析のプログラムを作成している。Rustの構造はなかなか慣れないので、進めるのが大変だ。
Goblinを使った場合、Sectionを一つずつ解析して、バイナリの入っている部分を取り出していく必要がある。
for section in &elf.section_headers { println!("elf.section_headers = {:#?}, file_offset = {:#x}, size = {:#x}", &shdr_strtab[section.sh_name], section.sh_offset, section.sh_size ); for idx in 0..section.sh_size { let mut offset = idx+section.sh_offset; print!("{:02x}", buffer[offset as usize]); if idx % 4 == 3 { print!("\n"); } } }
上記のようにして、elfのバッファ(そのままelfファイルをバイナリとして配列で格納したもの)があるので、各セクションのヘッダ部分をオフセットで計算する。それがsection.sh_offset
だ。
このような実装で、とりあえず各セクションからバイナリの情報を引き出すプログラムを構築した。
cargo run ~/work/rocket-chip-msyksphinz/riscv-tools/riscv-tests/benchmarks/qsort.riscv elf.section_headers = "", file_offset = 0x0, size = 0x0 elf.section_headers = ".text.init", file_offset = 0x1000, size = 0x1c5 81400141 81410142 81420143 81430144 81440145 81450146 ... 4e7fee7f 51617300 20300000 00elf.section_headers = ".tohost", file_offset = 0x2000, size = 0x48 00000000 00000000 00000000 ... 00000000 00000000 00000000 elf.section_headers = ".text", file_offset = 0x2048, size = 0x8c0 aa871737 00001307 e7ae0145 0c4303a8 ... elf.symbol = "" 0x80005b38 elf.symbol = "" 0x80005b80 elf.symbol = "" 0x0 elf.symbol = "/tmp/cc9WJ5Mg.o" 0x0 elf.symbol = "trap_entry" 0x80000120 elf.symbol = "qsort_main.c" 0x0 elf.symbol = "verify.constprop.1" 0x80001048 elf.symbol = "syscalls.c" 0x0 elf.symbol = "vprintfmt" 0x800011ba