November 14, 2016

GPU PROFILING

GPU performance調べ

ID3D11Query

ID3D11Queryで、GPUが処理した様々な情報を取得できるようです。 time stampを取得して、処理にかかった時間を計測できるようにしました。

StartProfileでは、

  • QUERY_TIMESTAMP_DISJOINT を ID3D11DeviceContext::Begin
  • start time用の QUERY_TIMESTAMP を ID3D11DeviceContext::End

EndProfileでは、

  • end time用の QUERY_TIMESTAMP を ID11DeviceContext::End
  • QUERY_TIMESTAMP_DISJOINT を ID3D11DeviceContext::End

Profileの結果取得では、

  • ID11DeviceContext::GetData で、結果を取得

上記の呼び出しで、time stampを取得でき、その差分で時間を計測することができました。 ID11DeviceContext::GetDataは、データが取得できるまで待たなければならない為、別のスレッドで取得するか。 取得自体を遅らせて、数フレーム前の情報を取得しなければ、CPU側の待ちが大きくなってしまうようです。 数フレーム前の情報を取得するには、 Queryをリングバッファで作成して、遅延フレームを設定して数フレーム前の情報を取得するようにしました。

コードは以下の感じ、

    void Profiler::StartProfile(const std::string& name)
    {
        ProfileData& profileData = m_profiles[name];

        if (profileData.DisjointQuery[m_currFrame] == nullptr)
        {
            // Create the queries
            D3D11_QUERY_DESC desc;
            desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT;
            desc.MiscFlags = 0;
            device->CreateQuery(&desc, &profileData.DisjointQuery[m_currFrame]);

            desc.Query = D3D11_QUERY_TIMESTAMP;
            device->CreateQuery(&desc, &profileData.TimestampStartQuery[m_currFrame]);
            device->CreateQuery(&desc, &profileData.TimestampEndQuery[m_currFrame]);
        }

        // Start a disjoint query first
        context->Begin(profileData.DisjointQuery[m_currFrame]);

        // Insert the start timestamp
        context->End(profileData.TimestampStartQuery[m_currFrame]);
    }

    void Profiler::EndProfile(const std::string& name)
    {
        ProfileData& profileData = m_profiles[name];

        // Insert the end timestamp
        context->End(profileData.TimestampEndQuery[m_currFrame]);

        // End the disjoint query
        context->End(profileData.DisjointQuery[m_currFrame]);

        profileData.QueryStarted = false;
        profileData.QueryFinished = true;
    }

    void Profiler::EndFrame()
    {
        m_currFrame = (m_currFrame + 1) % QueryLatency;

        // Iterate over all of the profiles
        for (auto& iter : m_profiles)
        {
            ProfileData& profile = iter.second;
            if (profile.QueryFinished == false) {
                continue;
            }

            profile.QueryFinished = false;

            if (profile.DisjointQuery[m_currFrame] == nullptr)
                continue;

            // Get the query data
            uint64_t startTime = 0;
            while (context->GetData(profile.TimestampStartQuery[m_currFrame], &startTime, sizeof(startTime), 0) != S_OK);

            uint64_t endTime = 0;
            while (context->GetData(profile.TimestampEndQuery[m_currFrame], &endTime, sizeof(endTime), 0) != S_OK);

            D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjointData;
            while (context->GetData(profile.DisjointQuery[m_currFrame], &disjointData, sizeof(disjointData), 0) != S_OK);

            if (disjointData.Disjoint == false)
            {
                UINT64 delta = endTime - startTime;
                float frequency = static_cast<float>(disjointData.Frequency);
                profile.time = (delta / frequency) * 1000.0f; // msec
            }
        }
    }

結果

その他

EndFrameのCPU処理時間は、0.02msec程度でした。

参考

November 19, 2015

VS Code Automating Markdown compilation

Markdownで書きたい

なぜかMarkdownで書くことは決めていたのですが、何を使って書くのが楽なのかは、全然分からない。 Visual Studio Codeなら見えがよいっぽい環境が楽に手に入りそうな感じがあったので、 お試しと、Automating Markdown compilationまでやってみました。 Markdownの記法に慣れ親しんでもいないし、思い入れも無いです。


経緯

Markdownは、blogの文章を書く用に使用したいと思いました。 それで、いくつか試してみました、

  • StackEdit 有料だったので、やめました。今思えば、お金払ってもよかったかも。
  • emacsのMarkdown-mode、C-c C-c pでプレビューできる。今思えば、これでも良かったのかも。
  • AtomはMarkdownプレビューなんか遅いらしい、Sublime Textは、金がかかるっぽい。
  • はてなに移ってもいいかなって思って調べたけど、公告入るのでやめた。

というわけで、放置していたbloggerに、Markdownで書いて、出力したhtmlを貼り付ける方式にしました。


Install Visual Studio Code

https://code.visualstudio.com/ から入れた。

  • editor右上の[Split Editor]で画面の左右分割できた。
  • Ctrl + Alt + →/← で、左右画面の移動できる。
  • Ctrl + Shift + V or 右上の[Open Preview]で、Markdownのプレビューできる。

ここら辺の情報や、VS CodeでのMarkdownの表示の感じなどは、ググればいくつかでてきました。 インストールしてみて、mdファイルをちょっと編集してみて良さそうだったので、これでやってみることに決めました。 visual studio code、VS Codeどっちで検索するのがよいんだろう...


Automating Markdown compilation

htmlを出力してもらわないといけないので、 Markdown and VS Code をみながら、自動でhtml出力されるようにしてみました。


Step 0:Create a test MD file

空のフォルダで、以下のsample.mdファイルをVS Codeで作成した。 EXPLORE > Open Folderで、保存したディレクトリを選択しておく。 この状態で、F1からConfigure Task Runnerと打つと、.vscodeフォルダにtasks.jsonファイルが作成された。

sample.md

Hello Markdown in VS Code!
====================

This is a simple introduction to compiling Markdown in VS Code.

Things you'll need:
* [node](https://nodejs.org)
* [marked](https://www.npmjs.com/package/marked)
* [tasks.json](/docs/editor/tasks)

## Section Title

> This block quote is here for your information.


Step 1:Install Gulp

Gulp以前に、node.jsもないので、installしました。v4.2.2-x64 入れた。
npm install gulp gulp-markdown
参考のページだと、-g 付けてるけど、なんかうまくいかなくて、.vscodeがあるフォルダにlocalインストールした。


Step 2:Create a simple Gulp task

sample.mdがあるディレクトリに、gulpfile.jsを作成。

gulpfile.js

var gulp = require('gulp');
var markdown = require('gulp-markdown');

gulp.task('markdown', function() {
    return gulp.src('**/*.md')
        .pipe(markdown())
        .pipe(gulp.dest(function(f) {
            return f.base;
        }));
});

gulp.task('default', function() {
    gulp.watch('**/*.md', ['markdown']);
});


Step 3:Create tasks.json

.vscodeディレクトリにある、tasks.jsonに以下を記述。

{
    "version": "0.1.0",
    "command": "gulp",
    "isShellCommand": true,
    "tasks": [
        {
            "taskName": "default",
            "isBuildCommand": true,
            "showOutput": "always",
            "isWatching": true
        }
    ]
}


Step 4:Run the Build Task

Ctrl+Shift+Bを押すと、Build Taskが動き始めて、saveするたびに、 mdファイル名前に対応した、htmlファイルが更新されるようになりました。 それをブラウザで表示しといて、確認。最終的にその内容をそのままbloggerに貼り付ける。


その他

  • ブラウザで文字化けする -> 文字コードUTF-8に指定しなおしてる。面倒だ、なんとかしたい。
  • VS Codeを起動する度に、Ctrl+Shift+Bやってる。面倒だ。


参考

November 18, 2015

clang ASTのdump

ASTのdumpから

libtoolingで、ASTのtree走査を調べたりしてましたが、 そもそもASTのdumpがちゃんと出来ていないと、ASTの構造がどうなってるかも調べられないし、 なにも始まってないことに気がついたので、いまさら調べ。

以下のコマンドで出力、test.ccをdump

clang -Xclang -ast-dump -fsyntax-only test.cc

clang -cc1 --helpで ヘルプ
https://gist.github.com/masuidrive/5231110

-Xclang       :Pass <arg> to the clang compiler
-ast-dump     :Build ASTs and then debug dump them
-fsyntax-only :構文チェックのみ

以下のコードを試しにdumpした。

//test.cc
int func(int x) {
  int result = (x / 42)+2;
  return result;
}
clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x80083880 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x80083b70 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'char *'

`-FunctionDecl 0x80083c20 <test.cc:1:1, line:4:1> line:1:5 func 'int (int)'
  |-ParmVarDecl 0x80083bb0 <col:10, col:14> col:14 used x 'int'
  `-CompoundStmt 0x80083db8 <col:17, line:4:1>
    |-DeclStmt 0x80083d70 <line:2:3, col:26>
    | `-VarDecl 0x80083ca0 <col:3, col:25> col:7 used result 'int' cinit
    |   `-BinaryOperator 0x80083d58 <col:16, col:25> 'int' '+'
    |     |-ParenExpr 0x80083d28 <col:16, col:23> 'int'
    |     | `-BinaryOperator 0x80083d10 <col:17, col:21> 'int' '/'
    |     |   |-ImplicitCastExpr 0x80083d00 <col:17> 'int' <LValueToRValue>
    |     |   | `-DeclRefExpr 0x80083cd0 <col:17> 'int' lvalue ParmVar 0x80083bb0 'x' 'int'
    |     |   `-IntegerLiteral 0x80083ce8 <col:21> 'int' 42
    |     `-IntegerLiteral 0x80083d40 <col:25> 'int' 2
    `-ReturnStmt 0x80083da8 <line:3:3, col:10>
      `-ImplicitCastExpr 0x80083d98 <col:10> 'int' <LValueToRValue>
        `-DeclRefExpr 0x80083d80 <col:10> 'int' lvalue Var 0x80083ca0 'result' 'int'


参考


その他

-ast-list   :Build ASTs and print the list of declaration node qualified names
func
x
result
-ast-print  :Build ASTs and then pretty-print them
int func(int x) {
    int result = (x / 42) + 2;
    return result;
}
-ast-view   :Build ASTs and view them with GraphViz  
GraphVizないので

April 30, 2015

Ankiの単語帳作成

主にDUO用の作業

■CD音声の分割は、以下のままやった
  http://eigonokai.jp/duo30-splitting-method/

  出力は、以下のフォルダ
  作業用フォルダ\分割済み

■DUO 3.0の文字列は、以下からコピーした、合法ではなさげ
  https://quizlet.com/24183379/duo-30-flash-cards/original

  スクリプトで、list_eng.txt, list_jpn.txtを作った。
  スクリプトは、表示だけでそれをリダイレクトしただけ。

  duo3_0.csv に貼り付けて、sectionなど追加
  タブ区切り、UTF-8で出力する

■Ankiの音声ファイル
  データは、以下におく mp3ファイル
  C:\Users\who\Documents\Anki\ユーザー 1\collection.media

  記述は、以下の感じで書く
  [sound:002.mp3]

■Ankiのインポート
  Anki 起動して

  ノートを作った
  ノートタイプはduo用
  ツール > ノートタイプの管理 で作成など行う

  フィールド追加
  sound, section, id のフィールドを追加
  (フィールドはデータのcolumとの紐付けみたいなの)

  カードに
  {{sound}}<br>
  {{section}}[{{id}}]
  などいれて、表示されるように

  ファイル > 読み込む でインポート
  duo3_0.csv を選択する

  種類は、作ったノートを選択する(duo用)
  単語帳は、あらかじめ作っとく、(DUO 3.0)とか
  最初のフィールドが一致した場合、既存のノート更新する。

  フィールド割り当てを設定して、
  読み込みボタンを押す

  C:\Users\who\Documents\Anki
  以下に apkgファイルが出力される

■Ankidroidにいれる
  USBにつないで、PCからいれる
  sdcard/AnkiDroid 以下にapkgファイルを配置して、

  Ankidroidからインポートを実行する