並列アプリケーション向けインテル® TBB スケーラブル・メモリー・アロケーターの活用

Similar documents
インテル® Parallel Studio XE 2013 Windows* 版インストール・ガイドおよびリリースノート

インテル® Parallel Studio XE 2013 Linux* 版インストール・ガイドおよびリリースノート

Jackson Marusarz 開発製品部門

Product Brief 高速なコードを素早く開発 インテル Parallel Studio XE 2017 インテル ソフトウェア開発ツール 概要 高速なコード : 現在および次世代のプロセッサーでスケーリングする優れたアプリケーション パフォーマンスを実現します 迅速に開発 : 高速かつ安定し

インテル® Parallel Studio XE 2015 Composer Edition for Linux* インストール・ガイドおよびリリースノート

Tutorial-GettingStarted

インテル® Fortran Studio XE 2011 SP1 Windows* 版インストール・ガイドおよびリリースノート

Click to edit title

インテル® VTune™ Amplifier XE を使用したストレージ向けの パフォーマンス最適化

QNAP vsphere Client 用プラグイン : ユーザーガイド 2012 年 12 月更新 QNAP Systems, Inc. All Rights Reserved. 1

インテル® キャッシュ・アクセラレーション・ソフトウェア (インテル® CAS) Linux* 版 v2.8 (GA)

ピクセル同期を利用した順不同半透明描画 (更新)

チュートリアル: インテル® MPI ライブラリー向け MPI Tuner (Windows*)

1 つのツールを実行するだけで違いが出るのでしょうか? はい 多くの場合 複雑なバグを発見して アプリケーションの安定性を向上させることができます このガイドでは インテル Inspector XE 解析ツールを使用して コードの問題を排除する方法を説明します これにより コードの信頼性が向上し 開

Oracle Web CacheによるOracle WebCenter Spacesパフォーマンスの向上

21 章のお話

IntelR Compilers Professional Editions

InfiniDB最小推奨仕様ガイド

Microsoft Word - Circular-Memory-Leak_Mitigation

AIP2016R2 DC backup_restore

for (int x = 0; x < X_MAX; x++) { /* これらの 3 つの行は外部ループの自己データと * 合計データの両方にカウントされます */ bar[x * 2] = x * ; bar[(x * 2) - 1] = (x - 1.0) *

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows 日本語版 : インストール・ガイド

Microsoft* Windows* 10 における新しい命令セットの利用

Microsoft PowerPoint Quality-sama_Seminar.pptx

新しい 自律型データ ウェアハウス

PowerPoint Presentation

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

テクノロジーのビッグトレンド 180 nm nm nm nm nm On 2007 Track 32 nm には 150 億台の端末がネットワーク接続 * * "Gantz, John. "The Embedded

Intel Software Presentation Template

Microsoft Word - Manage_Add-ons

インテル(R) Visual Fortran コンパイラ 10.0

AquesTalk プログラミングガイド

Oracle Data Pumpのパラレル機能

Oracle Data Pumpのパラレル機能

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows : インストール・ガイド

ホワイト ペーパー EMC VFCache により Microsoft SQL Server を高速化 EMC VFCache EMC VNX Microsoft SQL Server 2008 VFCache による SQL Server のパフォーマンスの大幅な向上 VNX によるデータ保護 E

アプリケーション補足説明書(Office2003)

バトルカードでゲーマーやエンスージアストへの販売促進

AquesTalk Win Manual

Microsoft Word - ESX_Setup_R15.docx

システム要件 Trend Micro Safe Lock 2.0 SP1 Trend Micro Safe Lock 2.0 SP1 エージェントのシステム要件 OS Client OS Server OS Windows 2000 (SP4) [Professional] (32bit) Wind

Oracle ADF 11g入門

Silk Central Connect 15.5 リリースノート

POSIXスレッド

Microsoft Word - UniversalShield_Hitachi.doc

White Paper 高速部分画像検索キット(FPGA アクセラレーション)

PowerPoint プレゼンテーション

02: 変数と標準入出力

PowerPoint プレゼンテーション

アプリケーション補足説明書(Office2003)

目次 1 はじめに 製品に含まれるコンポーネント 動作環境... 4 オペレーティング システム... 4 Microsoft Visual Studio* 製品 製品のダウンロード 製品版をインストールする場合 評価版を

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft Word - Improved_Protected-Mode_API_Support

システム要件 Trend Micro Safe Lock Trend Micro Safe Lock 2.0 エージェントのシステム要件 OS Client OS Server OS Windows 2000 (SP4) [Professional] (32bit) Windows XP (SP1/

新製品 Arcserve Backup r17.5 のご紹介 (SP1 対応版 ) Arcserve Japan Rev. 1.4

自己管理型データベース: 自動SGAメモリー管理

Windows Server 2012/2012 R2 Active Directory環境へのドメイン移行の考え方

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

<4D F736F F D20836F E C C6F6E C EE682E888B582A2837D836A B2E646F63>

Trend Micro Safe Lock 2.0 Patch1 管理コンソールのシステム要件 OS Windows XP (SP2/SP3) [Professional] Windows 7 (SP なし /SP1) [Professional / Enterprise / Ultimate] W

USB フラッシュメモリUX-A064GT 用,UX-A032GT 用 セキュリティソフトインストールマニュアル USB フラッシュメモリ TransMemor y-ex TM UX-A064GT UX-A032GT セキュリティソフト インストールマニュアル セミコンダクター & ストレージ社 1

内容 インテル Advisor ベクトル化アドバイザー入門ガイド Version インテル Advisor の利用 ワークフロー... 3 STEP1. 必要条件の設定... 4 STEP2. インテル Advisor の起動... 5 STEP3. プロジェクトの作成

Nero ControlCenter マニュアル

<4D F736F F D20B6BCB5D7B2CCDED7D8CFC6ADB1D9315F43532E444F43>

KSforWindowsServerのご紹介

アプリケーション補足説明書(Office2003)Microsoft(R) Office 2003 Editions

Oracle Cloud Adapter for Oracle RightNow Cloud Service

02: 変数と標準入出力

Microsoft PowerPoint - 09.pptx

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

アプリケーション補足説明書Microsoft(R) Office 2003 Editions

Microsoft Word - PCOMM V6.0_FAQ.doc

システム管理者ガイド GIGAPOD 3 システム管理者ガイド - 負荷分散構成 第 1.01 版 2013 年 3 月 改訂履歴 No バージョン 日付 作成者 改訂者 補足 /09 トライポッドワークス 初稿 /03 トライポッドワークス cr

Touch Pen Utility

AquesTalk for WinCE プログラミングガイド

スレッド化されていないアプリケーションでも大幅なパフォーマンス向上を容易に実現

Microsoft(R) Office XP Professional/Personalモデル アプリケーション補足説明書

Touch Pen Utility

免責事項 Samsung Electronics は 製品 情報 および仕様を予告なく変更する権利を留保します 本書に記載されている製品および仕様は 参照のみを目的としています 本書に記載されているすべての情報は 現状有姿 のまま 何らの保証もない条件で提供されます 本書および本書に記載されているす

セキュリティボタン取扱説明書

Oracle Real Application Clusters 10g: 第4世代

Parallel Studio XE Parallel Studio XE hotspot ( )

Transitioning from Microsoft® Exchange Server 2003 to Exchange Server 2007 while using HP StorageWorks All-in-One Storage System for storage

セキュリティボタン取扱説明書

Microsoft PowerPoint - FormsUpgrade_Tune.ppt

Microsoft PowerPoint - OS11.pptx

Android Layout SDK プログラミング マニュアル

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

monologue Sound Librarian 取扱説明書

NetworkVantage 9

プラン作成ガイド ~ 仮想環境をエージェントレスで バックアップするプランの作成 ~ 年 8 月

AKiTiO Thunderboltシリーズ 設定ガイド -ソフトウェアRAIDの構成(Mac OS X/macOS)

はじめに Web アプリケーションの発展と普及の勢いは弱まる兆しがありません 弱まるどころか 加速し続けています これは これまでの ERP CRM Web 2.0 などの Web ベースアプリケーションが提供してきたメリットを考えると 不思議なことではありません Web アプリケーションの爆発的拡

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

Windows Server 2008 R2とPRIMERGYによる消費電力削減効果

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Caché SQL ゲートウェイの使用法

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

Oracle SolarisにおけるCPUリソースの制限方法

Transcription:

並列アプリケーション向けインテル TBB スケーラブル メモリー アロケーターの活用インテル スレッディング ビルディング ブロック ( インテル TBB) 2019 インテルコーポレーションソフトウェア開発エンジニア Nikita Ponomarev

アプリケーションの想定 高速な malloc/free クロススレッドはそこまで速くないかもしれないが忘れないようにする ローカルキャッシュでホットなオブジェクトを取得する キャッシュの連想度を乱用せず フォルス シェアリングを回避する スレッド競合を回避する メモリー消費を適度に保つ システム アロケーター +20% であれば OK API は標準 競争率は高い 2

アロケーター用 C インターフェイス インテル TBB アロケーター API アナログ API scalable_malloc C 標準ライブラリー (scalable_ prefix なし ) scalable_calloc scalable_free scalable_realloc scalable_posix_memalign scalable_aligned_malloc scalable_aligned_realloc scalable_aligned_free scalable_msize POSIX* Microsoft* C ランタイム ライブラリー ptr が指し示すメモリーブロックの使用可能なサイズ 3

アロケーター用 C++ インターフェイス アロケーター クラス tbb::scalable_allocator<t> tbb::cache_aligned_allocator<t> tbb::tbb_allocator<t> tbb::zero_allocator<t> メモリー リソース クラス (C++17 以降 ) tbb::scalable_memory_resource() グローバルアクセサー tbb::cache_aligned_resource 4

一般的なアーキテクチャー概要 スモール オブジェクト キャッシュ ( スラブ ) フロントエンド ローカル ラージ オブジェクト キャッシュ スレッドごとのストレージ グローバル ラージ オブジェクト キャッシュ バックエンド グローバルストレージ メモリーブロック メモリー領域 OS スモール オブジェクト (<=8KB) とラージ オブジェクト (>8KB) で構造と割り当て手法は異なる 5

フロントエンド - スモール オブジェクト TLS ローカル ラージ オブジェクト キャッシュ ( 最小 -8 最大 -32) ビン 8B 8KB ラージ メモリー ブロック ラージ メモリー ブロック 合計サイズ 4MB フリー スラブ プール ( 最小 -8 最大 -32) 空のスラブ アクティブスラブ フルスラブ 空のスラブ 空のスラブ バックエンド 6

フロントエンド - スモール オブジェクトの詳細 バンプポインター スラブ ヘッダー 16KB でアライメントされたブロック プライベート フリー リスト パブリック フリー リスト LIFO リスト スラブを同じサイズのオブジェクト ( サポートしているサイズ以下の要求されたサイズでアライメント ) とヘッダー (2 キャッシュライン ) に保つ オーナーがスレッドの割り当てを解除 プライベート フリー リスト マージ アルゴリズム オーナー以外がスレッドの割り当てを解除 パブリック フリー リスト 7

割り当て / 解放の手法 割り当て : 1. TLS に移動する 2. サイズでビンを見つける 3. アクティブなスラブを見つける 4. スラブのフリーリストでオブジェクトを見つける 5. オブジェクトを返す 解放 : 1. アドレスをアライメントする 2. スラブヘッダーを見つける 3. 自身の TID を見つける 4. スラブの TID と比較する 5. オブジェクトをスラブのフリーリストに入れる 6. スラブをアクティブに移動する ホットなパスにアトミックがない! 8

フロントエンド - ラージ オブジェクト ユーザーが要求したサイズ ラージ メモリー ブロック (>8KB) LMB ヘッダー ラージ オブジェクト ヘッダー ユーザー オブジェクト キャッシュの連想度を効率的に使用するためキャッシュライン間でオブジェクトをランダムにシャッフルする 9

フロントエンド - グローバル ラージ オブジェクト キャッシュ 高速検索のビットマップ ヒュージキャッシュ 8MB 64MB 8KB +8KB ラージキャッシュ 8MB ラージ メモリー ブロック ラージ メモリー ブロック LIFO リスト エイジでソート キャッシュビン 通常クリーンアップ アグリゲーター 操作 : GET PUT CLEAN CLEAN_TO_THRESHOLD 個々のビンの履歴に基づいてクリーンアップする LRU 方式で 特定のエイジしきい値よりも古いすべてのオブジェクトまたはキャッシュの存在期間が非常に長いオブジェクトをクリアする 強力クリーンアップ すべてのビンのすべてのオブジェクトをクリーンアップする バックエンド 10

アグリゲーター - 競合の軽減 スレッドを待機 スレッドを集計 TH1 TH2 TH3 アグリゲーター操作 {TYPE} 操作完了フラグまで待機 アグリゲーター 1 つのスレッドのみ実行操作を開始でき ほかのスレッドは待機する handle_operations(operation_list_t* list) { 操作リストを反復 各操作タイプ (GET PUT CLEAN) の特別な操作を行う 結果を各操作に戻す } 操作のリストを作成 11

バックエンド - 全体的な構造 バックエンド ビン ラージ メモリー ブロック メモリーブロック ( スラブ ) メモリーブロック ( ラージ ) メモリーブロック メモリー領域 ( 分割可能 ) メモリー領域 ( 単一 ) メモリーの割り当て / 割り当て解除 メモリーの割り当て / 割り当て解除 OS レイヤー 3 スレッドまで同時に OS からメモリーを追加できる バックエンドが分割 / 融合を行い キャッシングは利用せず バッファリングは利用する 共有状態なし : 領域およびブロックは互いについて何も知らない 12

バックエンド - ブロックの融合 マイロック / サイズ 残りのロック / サイズ 融合後のオブジェクト サイズを書き込む マイロック / サイズ 残りのロック / サイズ 2 つ目のロックを取得 最初のロックを取得 残りのサイズを取得 マイロック / サイズ 残りのロック / サイズ マイロック / サイズ 残りのロック / サイズ 融合後のオブジェクト サイズを書き込む マイロック / サイズ 残りのロック / サイズ 13

アロケーター チューニング API - 構成 int scalable_allocation_mode(int mode, intptr_t value): TBBMALLOC_USE_HUGE_PAGE ヒュージページを使用 ( トランスペアレント ヒュージ ページをサポート ) 値は 1 または 0 ( デフォルト ) TBBMALLOC_SET_SOFT_HEAP_LIMIT 全体的なキャッシング制限を定義 値はサイズ ( バイト ) TBBMALLOC_SET_HUGE_SIZE_THRESHOLD ( インテル TBB 2019 Update 6 以降 ) クリーンアップが明示的に要求されない限り OS に解放されない割り当ての下限しきい値を定義 値はサイズ ( バイト ) 類似環境変数 : TBB_MALLOC_USE_HUGE_PAGE および TBB_MALLOC_SET_HUGE_SIZE_THRESHOLD 14

アロケーター チューニング API - コマンド int scalable_allocation_command(int cmd, void *reserved): TBBMALLOC_CLEAN_THREAD_BUFFERS スレッドのメモリーバッファー ( スモール オブジェクト フリー スラブ プール LLOC) をクリーンアップする TBBMALLOC_CLEAN_ALL_BUFFERS アロケーターのグローバル メモリー バッファー ( および呼び出しスレッドのバッファー ) をクリーンアップする 正しいクリーンアップ プロシージャー : 利用可能なメモリーをすべて解放 -> すべての 割り当て スレッドで TBBMALLOC_CLEAN_THREAD_BUFFERS を呼び出す -> メイン スレッドで TBBMALLOC_CLEAN_ALL_BUFFERS を呼び出す 15

メモリープール - プレビュー機能 すべてのアロケーター構造 ユーザー指定のメモリーで次が可能 すべてのメモリーの高速割り当て解除 メモリー フラグメントと個々のグループ間の同期を抑える ユーザー指定のメモリーのソースを含む アプリケーション インテル TBB アロケーター エンジン ユーザー指定のメモリー ユーザー指定のメモリー 16

メモリープール - 例 // 固定サイズのバッファーからのメモリープール char buffer[1024 * 1024]; tbb::fixed_pool my_fixed_pool((void*)buffer, 1024 * 1024); // ユーザー指定のアロケーターからのメモリープール tbb::memory_pool< std::allocator<char> > my_pool; // メモリープールを作成 void *ptr = my_pool.malloc(8); // 8 バイト割り当て ptr = my_pool.realloc(ptr, 24); // 割り当てを 24 バイトに拡張 my_pool.free(ptr); // 割り当てを解除 my_pool.recycle(); // 再利用のためプールのメモリーをすべて解放 // コンテナーの使用法 typedef tbb::memory_pool_allocator<int> pool_allocator_t; std::list<int, pool_allocator_t> my_list(pool_allocator_t(my_pool)); 17

メモリー API 置換ライブラリー 動的メモリー割り当ての標準関数に対するすべての呼び出しをインテル TBB 関数に自動的に置換 異なる DLL に分離 tbbmalloc_proxy Windows* トランポリンで MSVC ランタイムをフック Linux*/macOS* 単純なシンボル置換 リンカーは最初に見つけたシンボル (malloc calloc free その他 ) を使用する LD_PRELOAD 環境変数 (Linux*) DYLD_INSERT_LIBRARIES (macos*) 18

補足資料 19

オブジェクトを特定する方法 free() には長さがない 確実に見つけるには? システム アロケーターに負荷をかけると所有権を検出できる 解決策は逆参照 : フリー ホット パスの最大 2 つのコールドリード free(0xx81c00) 0xX80000 small objects in 16KB block 0xX84000 header Backreference+large large object block header backreference+small small object 32 B free(0xx87080) small object 32 B 0xX88000 20

逆参照 ブロックヘッダー逆参照インデックス リーフテーブル ヘッダー ptr ヘッダー ptr ユーザーデータ スモール オブジェクト ユーザーデータ スモール オブジェクト マスターテーブル ブロックヘッダー逆参照インデックス リーフテーブル ラージ オブジェクト ユーザーデータ ヘッダー ptr... 21

グローバル ラージ オブジェクト キャッシング手法 エイジベースのクリーンアップ エイジはプログラム開始後の put/get の数 ビン エイジはグローバルステート しきい値 : 16KB エイジしきい値 0 1. ミスする場合は増やす 2. 非常に長い で合計キャッシュが 非常に大きい 場合は減らす 24KB エイジしきい値 300 ラージ ブロック エイジ 100 ラージ ブロック エイジ 200 ラージ ブロック エイジ 500 3. 非常に長い を使用していない場合はすべて忘れて 長時間実行しているプログラムで減らさない 各ビンには個別のしきい値がある 異なる使用モードの近似は不適切 8MB エイジしきい値 200 ラージ ブロック エイジ 100 クリーンアップしきい値 魔法の定数はない 22

ヒュージサイズしきい値 - デフォルト ヒュージキャッシュ プログレッシブ ステップ 64MB 非常に大きな値 (~1TB) 8MB オリジナルのキャッシュの動作 デフォルトの最大サイズ 64MB を超えるオブジェクトをキャッシュしない ヒュージサイズしきい値 23

ヒュージサイズしきい値 - 定義 TBB_MALLOC_SET_HUGE_SIZE_THRESHOLD=32 プログレッシブ ステップ 32MB 64MB 非常に大きな値 (~1TB) 8MB ヒュージサイズしきい値 デフォルトの最大サイズ ヒュージサイズしきい値がデフォルトの最大サイズ以下のため (OS がメモリーを割り当てない場合を除いて ) 緑のビン (32MB 以上 ) はオブジェクトを解放しない TBB_MALLOC_SET_HUGE_SIZE_THRESHOLD=128 プログレッシブ ステップ 64MB 128MB 非常に大きな値 (~1TB) 8MB ヒュージサイズしきい値がデフォルトの最大サイズよりも大きいため 青のビン (64<B<128) のオブジェクトは OS が利用できる デフォルトの最大サイズ ヒュージサイズしきい値 24

メモリー プール ライブラリー アーキテクチャー ユーザー レベル クラス コンストラクターデストラクター allocate() deallocate() ライブラリー コールバック request_size struct PoolPolicy { void*(*rawalloc)(size_t); int (*rawfree)(void*, size_t); size_t granularity; bool fixedpool; bool keepallmemory; } MemoryPool* pool_create(poolpolicy); void pool_destroy(memorypool*); void* pool_malloc(memorypool*, size_t); void pool_free(memorypool*, void*); class rml::internal::memorypool ユーザーレベル ライブラリー レベル 25

ありがとうございました 26

法務上の注意書きと最適化に関する注意事項 性能に関するテストに使用されるソフトウェアとワークロードは 性能がインテル マイクロプロセッサー用に最適化されていることがあります SYSmark* や MobileMark* などの性能テストは 特定のコンピューター システム コンポーネント ソフトウェア 操作 機能に基づいて行ったものです 結果はこれらの要因によって異なります 製品の購入を検討される場合は 他の製品と組み合わせた場合の本製品の性能など ほかの情報や性能テストも参考にして パフォーマンスを総合的に評価することをお勧めします 詳細については www.intel.com/benchmarks ( 英語 ) を参照してください 本資料の情報は 現状のまま提供され 本資料は 明示されているか否かにかかわらず また禁反言によるとよらずにかかわらず いかなる知的財産権のライセンスも許諾するものではありません 製品に付属の売買契約書 Intel's Terms and Conditions of Sale に規定されている場合を除き インテルはいかなる責任を負うものではなく またインテル製品の販売や使用に関する明示または黙示の保証 ( 特定目的への適合性 商品性に関する保証 第三者の特許権 著作権 その他 知的財産権の侵害への保証を含む ) をするものではありません 2019 Intel Corporation. 無断での引用 転載を禁じます Intel インテル Intel ロゴは アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です 最適化に関する注意事項 インテル コンパイラーでは インテル マイクロプロセッサーに限定されない最適化に関して 他社製マイクロプロセッサー用に同等の最適化を行えないことがあります これには インテル ストリーミング SIMD 拡張命令 2 インテル ストリーミング SIMD 拡張命令 3 インテル ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します インテルは 他社製マイクロプロセッサーに関して いかなる最適化の利用 機能 または効果も保証いたしません 本製品のマイクロプロセッサー依存の最適化は インテル マイクロプロセッサーでの使用を前提としています インテル マイクロアーキテクチャーに限定されない最適化のなかにも インテル マイクロプロセッサー用のものがあります この注意事項で言及した命令セットの詳細については 該当する製品のユーザー リファレンス ガイドを参照してください 注意事項の改訂 #20110804 27