FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

「GPUを支える技術」を読む(第4章 後半)

Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。

なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。

今回は第4章後半。NVIDIA以外のGPUの話と、最新のGPUの新機能の話。

https://0rhsdq.bn1304.livefilestore.com/y4m3qSdO-84x6JVFksVxXo1KS1k0x5mw3GBXZN904WPBKRSOGONH-68fDXXEpj29HIDA2PwYBwz1Pc1B4yJh13_uohtSg7kdeWTr0f9EbvGI5Z8iA9HOAKg10fsY8ye-AyALgr2__O7A7l1SVoZ43jOIDfaNFfiMFpVvamFiEOthD5IboyL0h3mt0IaSMlDBDNs7e0dskBNQZ6JfQEkkJy64g?width=1414&height=3856&cropmode=none
f:id:msyksphinz:20171110003212p:plain

「GPUを支える技術」を読む(第4章 前半)

Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。

なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。

今回は第4章前半。NVIDIA P100のザックリとした構造の概要。

https://1bhydq.bn1304.livefilestore.com/y4mTd0gpgPEcVGmwQzBXpiMR3piNxs4qeQZw4ErOEwngOefHyGXoCJiD42rolDLs5rF0E3uYtFLzTcTzFLumGARG1RaYgDci4kiV9IivhBjsd9C1v94VI7UyBllyLnHkrrmnhfyqLLa41mXTqfKhitbr0gxxP5Ep04RItcSIepLVXCM18BgOcTRnc0Hkt6RzfyCz2zmqGN0OJnATZu12EKmbQ?width=1440&height=8322&cropmode=none

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

f:id:msyksphinz:20171109014246p:plain

「GPUを支える技術」を読む(第3章)

Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。

なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。

今回は第3章。

https://1hhtdq.bn1304.livefilestore.com/y4mni9uaWk0_UVJOhj0DUQ07fMylWrCIhCMWasnKyRWfDCPQgZp1Y2iLhqmEEbg5mH0IHHuJ5_fU7VyX8KF84vUmGJEraaswQGh_s8m1Whs_D44gj_SLPEzLkx0HWO8Zs1m97uiYY_5a649Zz9FqbzrjLzNdLUQCTdxPI6BoGFCTiTSlvPZOdwhp9bDbVqnWVTgoUcz1pS0pcvmfnXQtMoZrg?width=1440&height=5909&cropmode=none

f:id:msyksphinz:20171108005203p:plain

(https://wccftech.com/review/intel-core-i7-6700k-skylake-k-cpu-review-asus-z170-pro-gaming/3/ より)

プログラミング言語Rustに入門中 (goblinを使ってelfファイルを解析する3.)

f:id:msyksphinz:20171103203951p:plain

Rustのライブラリを使えばElfの解析だってできる。

バイナリファイルを読み込んで、HashMapにアドレスとデータの対を格納するプログラムを作成した。 各セクション毎にデータを読み込んで一つのHashMapにバイト単位でデータを書き込む。このモデルを作成すれば、Rustで簡単な命令セットシミュレータが作れるようになるはずだ。

  • training/program/rust/projects/sim_mem_elf/src/main.rs

github.com

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

f:id:msyksphinz:20171107012422p:plain

ただしまだRustとかScalaの初心者なので、MutableとかImmutableとか、まだ分かっていないことが多い。コンパイラの結果を見ながら進めている感じ。こんなので大丈夫かな?

「GPUを支える技術」読む (第2章)

Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。

なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。

今回は第2章。

https://1rhvdq.bn1304.livefilestore.com/y4mGqo8qCKInmFDMPOIy79rwY84DPKN9fWDZ24jkXV0rjjHzvmRh7bHqW-BZR074BWQzpZe5JF-WpY9l5A2cuJOcZ3eB6DlxyD2ygfqQGH4mAH1ETBCrN4N6mCEIroTgzeUmz0vVtsLSQpHp8MPA3NFwiGEFXtTw-N7J7HkdLwLdews8NsnQ_QKCdfWGDHnFevcUJj8YrBFqeVheC2EkLgx5A?width=1920&height=5696&cropmode=none

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

f:id:msyksphinz:20171105231317p:plain

「GPUを支える技術」読む (第1章)

Hisa Ando氏の著書「GPUを支える技術」を買っていたのだが、ずいぶんと積ん読にしているのだった。

なので、一応最後まで読んでいきたい。こういうのは、きちんと宣言しないと途中で辞めちゃうので宣言する。頑張って最後まで読んでいこう。

一応、Jupyter Notebookでまとめを作っていく。画像などはコピーではなく、すべて自分で作成している。

これを最後までできるかな?頑張る。

https://zhhqrw.bn1304.livefilestore.com/y4m0LeEY6uHe38Rx39YNIrxDeH4IAFz_aGW0AMUAwiX8uRQl8G4RMEv3qh0Jhao6UFV7kjKU4vQvBgkIO68sjFp-W0b0FrFvIzbPgWFH--hCVgUAFzcUDUOPD5A_rJkndBrs4igCIqAwOw-O0wAM9x27zQ5oogLVaKILztmqMtGG_VRrFmq7u2ZS8AClFZJr-B0f6Blq2gLEr-q9rEt6gt0xQ?width=1423&height=2991&cropmode=none

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] (WEB+DB PRESS plus)

f:id:msyksphinz:20171105011618p:plain

プログラミング言語Rustに入門中 (goblinを使ってelfファイルを解析する2.)

f:id:msyksphinz:20171103203951p:plain

RustのライブラリであるGoblinを使って、バイナリファイルを解析のプログラムを作成している。Rustの構造はなかなか慣れないので、進めるのが大変だ。

Goblinを使った場合、Sectionを一つずつ解析して、バイナリの入っている部分を取り出していく必要がある。

github.com

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