【レポート】Amazon EC2 F1 InstancesでC/C++を高速化する #reinvent #CMP313

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

本記事はAWS re:Invent 2017のセッション「CMP313 - How to Accelerate C/C++ Code Efficiently On Amazon EC2 F1 Instances」のレポートです。本セッションはChalk Talkです。プレゼンテーションだけではなく、参加者からの質問や議論を行うことを目的としたセッションとなっています。

概要

セッションの概要は以下のようになっています。

The newly introduced Amazon EC2 F1 OpenCL development workflow helps software developers with little to no FPGA experience supercharge their applications with Amazon EC2 F1.  Join us for an overview and demonstration of accelerating your C/C++ applications in the cloud using OpenCL with Amazon EC2 F1 instances.  In this workshop, we walk you through the development flow for creating a custom hardware acceleration for a software algorithm.  Attendees get hands-on and creative by optimizing an algorithm for maximum acceleration on Amazon EC2 F1 instances.

登壇者

議論に参加するために、開発関係者らしき方々が複数名参加しており、その方達も交えて活発な議論が行われました。

セッション

セッションの前半は、FPGAによるアクセラレーションについての解説が行われました。

  • F1によるFPGAアクセラレーション
  • クラウドFPGAのアプリケーション
    • ゲノミクス
    • Financial Analytics
    • 画像/動画処理
    • エンジニアリングシミュレーション
    • ビッグデータ解析
    • セキュリティ
    • 圧縮
    • 機械学習
  • セッションの内容
    • AWS F1でC/C++アクセラレーションの概要
    • どの部分を高速化すべきか
    • C/C++のホストとカーネルの最適化設計
    • Q/A
  • C/C++/OpenCLの開発フロー
  • 高速化の手法
    • パイプライニング
    • ビット操作(CRC, SHA)
    • 広いデータパス(fuzzy-search, RSA)
    • 特殊なメモリ階層化
  • どのようにソフトウェアのどの部分を高速化するべき箇所を決めるか
  • Amdahl's Law
    • 2割:8割の法則
  • 高速化可能なソフトウェアを特定する
    • プロファイリングツールやフレームグラフを使う

  • 高速化可能な状況の評価
  • カーネル関数からメモリへのインターフェース
    • ビット幅をできるかぎり最大化する
    • カーネル関数をできるかぎりビジーに
    • DDRの帯域幅を生かすようローカルメモリへバースト転送
    • 4つあるDDRバンクを最大限に活用
  • パイプライニングによる高速化
  • ループ並列化
  • ホストソフトウェアパイプライン
    • カーネル関数を複数用意して通信と処理をオーバーラップさせる
  • データ転送の遅延を先行するコマンドのスロットに差し込む
  • 関連するセッション
    • CMP402 Accelerate Your C/C++ Applications with Amazon F1 Instances
      • ワークショップ(2時間)
    • CMP308 FPGA Accelerated Computing Using Amazon EC2 F1 Instances
      • アプリケーション紹介

ディスカッション

プレゼンテーションのあと、QA時間がたっぷりと用意されていました。会場から多くの質問がされて、登壇者や開発関係者とおぼしき方々と議論が交わされていました。

  • 開発のプロセスについて
    • 明日のワークショップでやるよ。コードはgithubにすべてある。
  • 高速化のためのデータ分割の方法は?
    • FPGAはフレキシブルなので最適な方法を選べる
  • データ転送
    • カーネル間の通信は速い
      • ただしカーネルはビジーループで待つ
    • カーネルとメモリは数百サイクルを要する
  • 明日のワークショップでプロファイルからチューニングをするよ
    • pragmaの使い方

ホワイトボードでの議論もありました。

感想

セッションは比較的小さめの会場で行われましたが、予想以上に活発な議論が行われていました。どんな方が参加されるのかに興味があったのですが、エッジの効いたソリューションを作ろうとしている開発者の方々が参加されていたようでした。