FPGAで数理最適化をスピードアップ ① ― なぜGPUではなくFPGAなのか?

シミュレーション時間増大という課題に挑戦する

現代の産業の研究開発において、複雑な現象から最適解を導き出す「数理最適化」は競争力の源泉です。しかし、数理モデルの複雑化等に伴う「計算時間の増大」が意思決定を遅らせる大きな壁となっています。この課題を打破すべく、我々が持つFPGAの演算高速化プログラム開発技術を、進化的アルゴリズム(Evolutionary Algorithms, EAs)の1つである「差分進化法」を用いた最適解探索ループへ取り入れて、探索時間のスピードアップに挑戦しました。

圧倒的演算スピードをもたらすFPGAハードウェアアクセラレーション

差分進化法は、膨大なパラメータ候補を数理モデルへと投入し、評価と更新のループを数万回繰り返すことで最適解を探索します。一回の演算は数秒でも、ループを繰り返せば累積時間は容易に100時間単位へ膨れ上がります。この膨大な累積時間が、業務スピードを阻害する最大のボトルネックとなっていました。

そこで我々は、数理モデルのパラメータ演算アルゴリズムをFPGA上に実装し、ハードウェア的に並列処理する「ハードウェアアクセラレータ」を開発しました。これにより、PC1台で従来の常識を覆す高速環境を提供します。

なぜGPUではなくFPGAなのか

ハードウェアによる演算高速化の手段として一般的なGPUに対し、本プロジェクトでFPGAを選択したのには明確な理由があります。1つは演算の自由度です。GPUが得意とする単純演算の反復に対し、FPGAは平方根や対数といった複雑な算術演算を組み合わせて実行する専用回路を構築でき、無駄のない高速化が可能です。もう1つは、オンプレミスによる高いセキュリティです。演算はローカルPC内のFPGAで完結するため、外部サーバーへの送信が一切不要。機密データの流出リスクを物理的に排除した、安全な高速演算環境が実現できます。

本記事では、効率的な演算を実現したFPGAアクセラレータの設計手法を中心に解説します。

全体システムとFPGA回路構成概要

全体システム

本プロジェクトでは、自然現象を記述する「反応拡散方程式」を数理モデルとして採用。下図のようなPCとFPGAボードを高度に連携させた計算基盤を構築しました。

全体システムと主要スペック

システム主要スペック

  • ホストPC: CPU Core i7-12700 / メモリ 32GB / OS Ubuntu 20.04.06
  • FPGAボード: Xilinx Alveo U250
  • アクセラレータ構成: 32個の「反応拡散方程式(RDE)演算器」を搭載し、並列処理を実現

このシステムでは、PC上の制御プログラムからFPGAへデータを送り、32個の演算器群で一斉に反応拡散方程式を解き、その結果を「差分進化法」のアルゴリズムへフィードバックするループを形成しています。

「設計の柔軟性」と「リソース効率」をもたらす、マイクロプログラム方式

今回の開発における核心は、FPGA内で計算に「マイクロプログラム」を採用した点にあります。ハードウェアで演算処理する場合、式を直接ゲート回路として固定(ハードワイヤード化)してしまう手法があります。しかし、これではわずかな数式の変更でもハードウェア自体の再設計(論理合成)が必要になり、開発の柔軟性が失われてしまいます。

私たちが考える「柔軟性」とは、数式を実行可能な最小単位の演算処理にまで分解し、それらを1つ1つマイクロ命令のシーケンスとして組むことです 。これにより、同じ演算回路を時分割で使い回すことが可能になり、限られたハードウェアリソースを最大限に活用した効率的な計算が実現します。

FPGA内のハードウェア回路構成について

このマイクロプログラムを実行するハードウェア回路構成について、その概要を示しました。

FPGAハードウェア回路構成概要

1つの演算回路が「制御部」「演算部」「格納部」の大きく3つの役割で構成されます。マイクロプログラムのマイクロ命令( 後で詳述します)に基づき、司令塔である「制御部」が命令を発行し、「演算部」が計算した結果を「格納部」に記憶させます。

制御部(赤): 司令塔の役割を果たします。マイクロプログラム(マイクロ命令)を読み込み、演算器への入力値の設定や命令のデコード、次に行うべき命令のアドレス生成を行います。

演算部(緑): 実際の計算を行う心臓部です。加算、減算、乗算、除算に加え、平方根や対数といった複雑な算術演算を**倍精度(64bit)**で実行し、ソフトウェアと同等の精度を確保します。

格納部(青): データの「置き場」です。変数を格納するメモリ部と、演算結果を一時的に保持する高速なレジスタ部で構成されます。

長くなりましたので、今回はここまでとします。次回はマイクロプログラム化のステップについてお伝えします。