「AMDで使うと遅いんだけど」 x86/x64最適化勉強会 #4 LT

Slides:



Advertisements
Similar presentations
位置情報と私 木村岳文 / 位置情報と私 / はじめに GPS 付き携帯、ハンディ GPS などを使っ て、お手軽に自分が地球上のどこにいる かを調べられるようになってきました。 このデータをつかって何かおもしろいこ とができそうな予感。 具体的にどうしたらおもしろいかはよく.
Advertisements

教育情報学教育部・研究部 合同セミナーの場合
静止画ファイル形式 小林 康三.
WPF で作る!! 仮想化支援技術確認ツール CLR/H ひよひよ Crystal Dew World
Motion-JPEG2000を使ったノードに最適な動画像配信
うわさ.
連続系アルゴリズム演習 第2回 OpenMPによる課題.
プログラマのレベルアップ.
Chapter11-4(前半) 加藤健.
全文検索エンジン groonga を囲む夕べ 2 #groonga
最近の気になるネタ presented by Kei-z.
メモリ管理(1).
和歌山大学全学FDワークショップ「授業改善に向けた私の工夫」
LZ圧縮回路の設計とハード・ソフト 最適分割の検討 電子情報デザイン学科 高性能計算研究室 4回生 中山 和也 2009/2/27.
表紙 Windows用起動画面集        ~劇場版 v.1,00~ 作成:カズキング 場所:ブログ「俺らしいブログ」
全体ミーティング (4/25) 村田雅之.
Androidの 画面描画機構を チューニングする!
読んだもの1 P0145R1: Refining Expression Evaluation Order for Idiomatic C++
クイズ 「インターネットを使う前に」 ネチケット(情報モラル)について学ぼう.
EGSに対応した粒子軌跡と 計算体系の3次元表示ソフト - CGVIEW -
相原玲二 広島大学情報メディア教育研究センター
心理学情報処理法Ⅰ コンピュータにおけるデータ表現 マルチメディアとコンピュータ.
情報学部のWebサイトを考える 2007年5月14日 石上隆達.
RAD Studio 14/09/27 TEffectを使った綺麗なForm
過去に行くのは不可能ではない 金子美咲 2011/10/26.
さとりすと Satori Ghost Editor 里々ゴーストの統合開発環境を作ったよ page: 1/25
反重力レンズ錯視 千葉大学文学部 柳 淳二 (次の画面からは自動で画面が切り替わっていきます。).
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
オペレーティングシステム i386アーキテクチャ(2)
発表者 2011/01/08 楽しい256バイトイントロの 世界 発表者 2011/01/08.
プロセッシング入門1 初歩のプログラミング.
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
2003年度 データベース論 安藤 友晴.
SpectreとMeltdown ITソリューション塾・第28期 2018年5月30日 株式会社アプライド・マーケティング 大越 章司
Windows 2000 拡張カーネルの技術紹介 2018年6月10日 黒翼猫.
MPIによるwavからmp3圧縮の検証 情報論理工学研究室 04‐1‐47‐200 木村 惇一.
RT-Linuxを用いた 多入力パルス波高分析システムの開発
MPIを用いた最適な分散処理 情報論理工学研究室 角 仁志
パフォーマンス徹底比較 Seasar2 vs Spring
動画ファイル形式 コンピュータでは、文字や画像、動画、音声といった様々な種類の情報を扱うことができるが、記憶装置に記録されるデータそのものは0と1の情報でしかない。動画ファイルの形式としてはMPEGやAVIです。
澤見研究室 I04I021 片山祐輔 I05I095 山田大志 I06I040 野崎祥志
Cプログラミング演習 第7回 メモリ内でのデータの配置.
Ut Video Codec Suite ~ これまで と これから ~
梅澤威志 隣の芝は茶色いか 梅澤威志
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
理化学研究所 重イオン核物理研究室 馬場 秀忠
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
EGSに対応した粒子軌跡と 計算体系の3次元表示ソフト - CGVIEW -
東京都立産業技術高等専門学校 専攻科1年 田邉 亮
Optimized C++! 最適化の手法集めました
プログラミング 4 整列アルゴリズム.
プロジェクト演習Ⅱ インタラクティブゲーム制作
VMが利用可能なCPU数の変化に対応した 並列アプリケーション実行の最適化
動画配信捕捉のためのWEBサーバ構築 06A1058 古江 和栄.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
参照されないリテラル 長谷川啓
秘匿リストマッチングプロトコルとその応用
全体ミーティング (5/23) 村田雅之.
Mondriaan Memory Protection の調査
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
SpectreとMeltdown ITソリューション塾・第27期 2018年3月20日 株式会社アプライド・マーケティング 大越 章司
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
VB6.0でグラフを書こう(とりあえず2次元)
Ut Video Codec Suite 高速化の11年
L4-Linux のメモリ管理における問題点とその解決策
コンピュータと音 B3 入野仁志(irino).
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

「AMDで使うと遅いんだけど」 x86/x64最適化勉強会 #4 LT 梅澤威志 (UMEZAWA Takeshi) @umezawa_takeshi

Q: dis ってんの? A: disasm なら少々…

※ http://pc11.2ch.net/test/read.cgi/avi/1205486331/178 自己紹介 映像可逆圧縮コーデック Ut Video Codec Suite の作者 ※ http://umezawa.dyndns.info/wordpress/?cat=28 ある2ちゃんねらー曰く、 UtVideo唯一の欠点 作者がニコ厨 ※ http://pc11.2ch.net/test/read.cgi/avi/1205486331/178 まったくツンデレなんだから…

前置き 今回話すことは、何人かの人は過去の x86/x64最適化勉強会で雑談などで既に聞いているはずです。 blog を検索しても出てきます。 知ってる人は寝てていいです。

あるユーザの報告 「AMD で ULRG や ULRA を使うとエンコードがすごい遅いんだけど」 ULRG は内部保持形式が RGB 8bpc のもの。 ULRA は同じく RGBA 8bpc のもの。 ULY2 (YUV422 8bpc) や ULY0 (YUV420 8bpc) は遅くないらしい。 デコードはエンコードほどではないが、やっぱり遅いことは遅いらしい。

実測 確かに遅い。 ULRG は 24bpp であり、16bpp である ULY2 と比較して同じ画像サイズの時 1.5 倍ぐらい遅いことが期待されるが、エンコードの場合は期待されるより3倍ぐらい遅い。 明らかに何かおかしい

エンコーダの実装 以下の順序で処理する。 Packed → Planar 変換 フレーム内予測 ハフマン符号化 フレーム内予測とハフマン符号化は種類によらず全く同じ処理なので、Planar 変換に問題がありそう。 本来は全体の 1 割ぐらいの時間なんだけど…

Planar 変換 r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = (ditto) b = (ditto) for (p = srcbegin; p < srcend; p += 3) { *(g++) = p[1]; *(b++) = p[0] - p[1] + 0x80; *(r++) = p[2] - p[1] + 0x80; }

ちょっと変えてみる…速度変わらず r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = (ditto) b = (ditto) for (p = srcbegin; p < srcend; p += 3) { *(g++) = p[1]; *(b++) = p[0] - p[1]; // + 0x80; *(r++) = p[2] - p[1]; // + 0x80; }

さらに変えてみる…やっぱり遅い r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = (ditto) b = (ditto) for (p = srcbegin; p < srcend; p += 3) { *(g++) = p[1]; *(b++) = p[0]; // - p[1] + 0x80; *(r++) = p[2]; // - p[1] + 0x80; }

遅くなくなった!? r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = (ditto) b = (ditto) for (p = srcbegin; p < srcend; p += 3) { *(g++) = p[1]; *(b++) = p[0]; r++; }

対照群:遅いまま r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = (ditto) b = (ditto) for (p = srcbegin; p < srcend; p += 3) { *(g++) = p[1]; *(b++) = p[0]; *(r++) = 0; }

ULY2 の場合(遅くない) y = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); u = VirtualAlloc(NULL, width * height / 2, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); v = (ditto) for (p = srcbegin; p < srcend; p += 4) { *(y++) = p[0]; *(u++) = p[1]; *(y++) = p[2]; *(v++) = p[3]; }

Q: なぜこうなるのでしょう?

A: store で毎回 L1 キャッシュミス するから

VirtualAlloc() 呼び出しプロセスのアドレス空間を予約あるいはコミットする。 POSIX の mmap() に似ている。 予約あるいはコミットするアドレスは「割り当て粒度 (allocation granularity)」に丸められる。 ページサイズ (=4KiB) ではない。 少なくとも Windows XP~7 においては、Win32 での割り当て粒度は 64KiB である。

AMD の L1 キャッシュ 長らく 命令 64KiB + データ 64KiB の構成 長らく 2-way セットアソシアティブ

両方合わせると… VirtualAlloc() で割り当てられたバッファは 64KiB 境界に整列しているので、各バッファの先頭アドレスは全て同じエントリアドレスを持つ。 ULRG では g, b, r のポインタが同じ速度で進み「常に」同じエントリアドレスになるため、1 バイトアクセスするたびにキャッシュミスして猛烈に遅くなる。

解決方法 ポインタが同じ速度で進むのだから、最初からずらしておけば今度は絶対に同じエントリアドレスにはならない。 p は 3 倍速で進むのでエントリアドレスが重なることがあるが、その時でも同じエントリアドレスを使っているのは 2 つだけなのでセーフ。

これで解決 r = VirtualAlloc(NULL, width * height, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); g = VirtualAlloc(NULL, width * height + 256, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE) + 256; b = VirtualAlloc(NULL, width * height + 512, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE) + 512; … ※ 256 でいいかどうかは議論(というか計測)の余地がある。

当時(あまり)考えなかったこと L1 キャッシュを共有する複数の物理スレッド Intel HT とかのことだが、Intel 系だと 8-way なので、2 スレッド走っても 1 スレッドあたり 4-way で問題なし。 AMD Bulldozer の場合、L1 は Bulldozer モジュールごとではなくコアごとに持ってるらしいから、半分にはならない?

まとめ? キャッシュの連想度にも(たまには)気を付けましょう。 でも 2-way はひどいと思います。 Intel は 8-way なのに。

Q: 結局 x86 関係あんの? A: さあ…?