FGA との連携 -- GPUを用いた高速画像処理


WIL の有償オプションライブラリである FGA (FAST GPU Accelerator) と連携し、 PyFIE で読み込んだ画像に対して NVIDIA 社の GPU ボードを利用した高速な画像処理を行うサンプルコードです。

FGA を Python から使用するために add_library() 関数を使用します。 ライブラリ定義ファイル pyfie_decl_fga_1.7.0.jsonダウンロード からダウンロードできます。 pyfie_decl_fga_1.7.0.json は サンプルコード sample_fga.py と同じフォルダに設置してください。

import os
import pathlib
import timeit

import pyfie

# 利便のため PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# WIL 3.1のFGAライブラリバイナリへのパス
fga_lib_path = pathlib.Path(os.path.expandvars("%WIL3_1_0X64%"), "fgamt.x64.3.1.0.dll")
# Linuxの場合は別のパスを指定する
# fga_lib_path = pathlib.Path("path/to/libfga.so")

# FGAライブラリへのバインディングを追加
pyfie.add_library(fga_lib_path, "pyfie_decl_fga_1.7.0.json")

# FGA のセットアップ関数を呼ぶ
pyfie.fnFGA_setup()

# チャネル数と画像サイズ
nch = 1
width = 4096
height = 4096

# FIE画像確保
hsrc_fie = pyfie.img_uc8(width, height, nch)
hdst_fie = hsrc_fie.empty_like()

# FGA画像確保
hsrc_fga = pyfie.fnFGA_img_root_alloc(pyfie.F_IMG_UC8, nch, width, height)
hdst_fga = pyfie.fnFGA_img_root_alloc(pyfie.F_IMG_UC8, nch, width, height)

# FIE側で入力画像作成
pyfie.jaehne_testimg(hsrc_fie)

def do_averageMxN_fie(hsrc_fie, hdst_fie):
    """FIEで5×5平均化フィルタを実行する"""
    pyfie.fnFIE_averageMxN(hsrc_fie, hdst_fie, 5, 5, pyfie.F_BORDER_NONE, 0)

def do_averageMxN_fga(hsrc_fie, hdst_fie, hsrc_fga, hdst_fga):
    """FGAで5×5平均化フィルタを実行する"""
    # FIE画像からFGA画像へコピー
    pyfie.fnFGA_img_copy(hsrc_fie, hsrc_fga)
    # FGAで処理実行
    pyfie.fnFGA_averageMxN(hsrc_fga, hdst_fga, 5, 5, pyfie.F_BORDER_NONE, 0)
    # FGA画像からFIE画像へコピー
    pyfie.fnFGA_img_copy(hdst_fga, hdst_fie)

# FIEとFGAの処理時間をそれぞれ計測して表示
num_iter = 100
exec_time_fie_ms = timeit.timeit(
    "do_averageMxN_fie(hsrc_fie, hdst_fie)", number=num_iter,
    globals=globals()) / num_iter * 1000
exec_time_fga_ms = timeit.timeit(
    "do_averageMxN_fga(hsrc_fie, hdst_fie, hsrc_fga, hdst_fga)",
    number=num_iter, globals=globals()) / num_iter * 1000
print(f"Mean execution time with FIE: {exec_time_fie_ms:.1f} milliseconds")
print(f"Mean execution time with FGA: {exec_time_fga_ms:.1f} milliseconds")

処理結果例

$ python sample_fga.py
Mean execution time with FIE: 42.2 milliseconds
Mean execution time with FGA: 8.4 milliseconds

備考

ダウンロード

関連サンプル