背景
FFTWは高速なFFTを実装できるオープンソースの1つです
FFTW公式サイト
私もCのコードを高速化するためにFFTWを導入しようとしましたが、Windowsでのインストールに苦戦しました
公式ドキュメントやブログには、以下のようなインストール方法が紹介されていますが、背景知識が乏しいため、うまくいきませんでした
- Visual Studioでコンパイル済みdllファイルを導入する
- →Visual Studioのプロジェクトを作成する必要がありそうで面倒。そもそもコマンドプロンプト上でコンパイルしたい
- MinGWでFFTWをコンパイルする
- →MinGWでライブラリをコンパイルする方法がそもそもよくわからない
そこで、私が試行錯誤の末にたどり着いた方法を記録します
読者の対象
-
CでFFTWを導入したい方(C++も可)
-
WindowsにFFTWをインストールしたい方
-
コマンドプロンプト(Visual Studioを経由しない)でコンパイルしたい方
-
MinGWを補うソフトウェアを導入してもよい方
著者のインストール環境(2024/09時点)
-
Windows 11
-
FFTW 3.3.10-5
インストール方法の要約
1. MSYS2をインストール
2. MSYS2 MINGW64のプロンプトでFFTWを含むコンパイルに必要なライブラリをインストール
3. コマンドプロンプトでCおよびC++のコードをコンパイル
詳細
1.MSYS2をインストール
MSYS(Minimal SYStem)とは
Windows上でUnixライクな環境を提供するソフトウェアの1つ
特にMinGW(Minimalist GNU for Windows)との組み合わせでよく使わる
MSYS2はその後継版
MSYS2を導入する利点
MinGWはWidowsでCやC++をコンパイルする際にインストールした方も多いでしょう
MSYS2はそのMinGWの機能を補完するような便利な機能があります
例えば、パッケージ化されたライブラリをpacman
のコマンドでインストールできます
そのパッケージインストールの手軽さがMSYS2を導入する利点です
MSYS2のインストール方法
インストーラのダウンロード
1. 公式サイトからインストーラ.exe
をダウンロードする
MSYS2 ダウンロードサイト
インストーラの実行
2. ダウンロードした.exe
を実行する
基本デフォルト設定でOK(カスタム可能)
MSYS2プロンプトの起動
3. アプリ「MSYS2 UCRT64」を開く(タスクバーの虫眼鏡アイコンから検索して開く)
MSYS2の初期設定
4. 出てきたプロンプトに以下のコマンドを実行して初期設定する
[Y/n]
で止まったらY
を入力してエンター
pacman -Syu
pacman -Su
MSYS2の環境変数を登録
5. 管理者用コマンドプロンプトを開いて以下のコマンドを1つずつ実行する
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\mingw64\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\usr\local\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\usr\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\opt\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
環境変数の確認
6.タスクバーの虫眼鏡から「環境変数を編集」を開き、ユーザ環境変数(U)
の変数PATH
をクリックして「編集(E)...」ボタンを押す
MinGWの優先順位を下げる
7. もし、以下のような今までのMinGWのPathがあるのであれば一番下へ移動させる
C:\MinGW\bin
※これでMSYS2がMinGWより優先的に参照されてうまく動作する
2.MSYS2 MINGW64で必要なライブラリをインストール
MSYS2 MINGW64プロンプトを起動
1. アプリ「MSYS2 MINGW64」を開く(タスクバーの虫眼鏡アイコンから検索して開く)
コンパイルに必要なパッケージをインストール
2.以下のコマンドを、MSYS2 MINGW64
のプロンプトで実行する
pacman -S base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain mingw-w64-x86_64-boost
FFTWのインストール
3. ブラウザでfftw msys
と検索し、Packageサイトのpacman
から始まるコマンドをコピーし、MSYS2 MINGW64
のプロンプトで実行する
pacman -S mingw-w64-x86_64-fftw
4. ほかに必要なライブラリがあれば別途pacman
でインストール
3.コマンドプロンプトでコードをコンパイル
以上の手順をもって、コマンドプロンプトでのコンパイルが可能になります
gcc -o a fftw_code.c -lfftw3 -lm
FFTWを使ってコンパイルする際は、-lfftw3 -lm
(double精度)、-lfftw3f -lm
(float精度)、-lfftw3l -lm
(long double精度)を使ってください
参考文献