| 429 | |
| 430 | == 新しい並列for構文のご提案 == |
| 431 | |
| 432 | * std::thread 使おう |
| 433 | * ループの並列化といえば… OpenMP! |
| 434 | {{{#!c++ |
| 435 | #Pragma omp parallel for |
| 436 | for (int i= 0; i < N; i++) { |
| 437 | // ... |
| 438 | } |
| 439 | }}} |
| 440 | * 並行じゃなくて並列… 早くならなきゃ意味が無い! |
| 441 | * タスク並列性(ex: パイプライン)、データ並列性(ex: 並列ループ) |
| 442 | * スレッドレベル並列 (マルチスレッドプログラミング) |
| 443 | * OpenMP |
| 444 | * OpenMP スレッドをまたぐ C++ 例外送出はNG ... ループ内に try - catch を書かなきゃいけない (ださい) |
| 445 | * libstdc++ Parallel Mode 拡張 |
| 446 | * foreach で書けてお手軽 |
| 447 | * バックエンドは OpenMP |
| 448 | * Intel TBB |
| 449 | * tbb::parallel_for_each |
| 450 | * 例外送出できる!! |
| 451 | * Microsofot ConcRT/PPL |
| 452 | * msvcrt にビルトイン |
| 453 | * concurrency::parallel_for_each |
| 454 | * 例外送出できる |
| 455 | * MSVC/Windows 専用 orz |
| 456 | * Intel CilkPlus |
| 457 | * cilk_for って書くだけ |
| 458 | * gcc, clang にも対応していくっぽい (現行はβ) |
| 459 | * ベクトルレベル並列 |
| 460 | * SIMD intrinsic (組み込み関数) |
| 461 | * 要アセンブラ知識 |
| 462 | * 命令セットごとに異なるコードが必要 (SSE2, AVX, NEON...) |
| 463 | * Boost.SIMD (NT^2^) |
| 464 | * SIMD 処理を一般化 (x86/SSE系列、AVX と PPC/AltiVec に対応) |
| 465 | * Intel CilkPlus / Array Notation |
| 466 | * 宣言的なコーディング (ベクトル演算のセマンティクス) |
| 467 | * clang は未対応… |
| 468 | * Thrust (GPGPU; CUDA) |
| 469 | * CPU向け (TBB, OpenMP) バックエンドも提供 |
| 470 | * Microsoft C++ AMP (GPGPU; DirectX) |
| 471 | * restrict(amp) ブロック内が並列化 |
| 472 | * CPU/GPU処理を統一的に記述 |
| 473 | * スレッドレベル vs ベクトルレベル |
| 474 | * スレッドレベル + ベクトルレベル = C++1y ParallelTS (N3850) |
| 475 | * C++ 並列ライブラリの広範な実装実験が目的 |
| 476 | * 実行ポリシー ...これで実行してほしいというヒント |
| 477 | * vec ...ベクトル演算 |
| 478 | * par ...マルチスレッド |
| 479 | * seq ...シングルスレッド |
| 480 | * データ数が多い場合に実行ポリシーを切り替える、といった動的ポリシー可能。 |
| 481 | * exception_list |
| 482 | * seq と par は補足 |
| 483 | * vec は例外使用禁止 (コケる) |
| 484 | * C++標準ではない |
| 485 | * まだ Working Draft 段階ですよ |
| 486 | |
| 487 | == 魔導書発売記念:GPGPUの今とこれから == |
| 488 | |
| 489 | * OpenAcc |
| 490 | * アクセラレータ向け言語仕様 |
| 491 | * pragma 挿入でコンパイラに指示 (C/C++/Fortran) |
| 492 | * GPU だけに限定される仕様ではない |
| 493 | * アクセラレータとは |
| 494 | * 日本語では「演算加速装置」 |
| 495 | * GPU |
| 496 | * 特に 3D Graphics |
| 497 | * NIC |
| 498 | * 動画のデコーダ・エンコーダ |
| 499 | * 汎用アクセラレータ (割りとなんでもできるやつ) |
| 500 | * GPU |
| 501 | * NVIDIA, AMD, Intel |
| 502 | * 特に NVIDIA GPU |
| 503 | * 汎用性を獲得したのはここ4,5年 |
| 504 | * 画面出力機能のない GPU(?) すらある |
| 505 | * Intel Xeon Phi |
| 506 | * Intel MIC (Meny Integrated Core) とも |
| 507 | * GPU の対抗馬 |
| 508 | * 画面出力機能はない |
| 509 | * スモールコア・メニーコア |
| 510 | * 遅くて |
| 511 | * 小さくて多数のコアがある |
| 512 | * メモリ帯域重視 |
| 513 | * データ並列向け |
| 514 | * 増設カードの形で提供されている |
| 515 | * アクセラレータ単体では動かせない |
| 516 | * 自立性 |
| 517 | * 子機として動作 - CPU がいないと起動できない |
| 518 | * GPU |
| 519 | * 自律動作はできない |
| 520 | * CPU の指示に従って動作 |
| 521 | * MIC |
| 522 | * 自立動作はできる |
| 523 | * プログラミング |
| 524 | * CUDA C, C++ (NVIDIA) |
| 525 | * 小回りがきかない |
| 526 | * CPU 向きの処理と GPU 向きの処理を分けたい |
| 527 | * 現状のシステムではオーバーヘッドがあり難しい |
| 528 | * PCI Express のレイテンシ、帯域 |
| 529 | * メモリー断絶 |
| 530 | * I/O は基本的にできない |
| 531 | * 最近、GPUメモリーを直接転送できるネットワークが登場 |
| 532 | * APU |
| 533 | * AMD |
| 534 | * AMD の CPU と GPU を密に結合したもの |
| 535 | * CPU と GPU のメモリー結合を実現 (hUMA) |
| 536 | * ポインタをそのまま GPU に渡せる!! |
| 537 | * 対応ソフトウェアがまだあまりない |
| 538 | * メモリー周辺が CPU のまま |
| 539 | * メモリー帯域がボトルネック |
| 540 | * Hyper Memory Cube (HMC) |
| 541 | * 次世代メモリー規格 |
| 542 | * NVIDIA Volta 世代で採用? |