プロジェクト

全般

プロフィール

A/I #14

未完了

Windows下でMinGWを使わず、Intel C++ Compiler(oneAPI)とCMakeを使ってPROJ等サードパーティをリンクしたプログラムが作れるか?

開発 次郎 さんが6ヶ月前に追加. 3ヶ月前に更新.

ステータス:
進行中
優先度:
通常
担当者:
開始日:
2025/05/30
期日:
予定工数:

説明

活動条件

  • oneAPI(Intel C++ Compiler)でコンパイルする
  • CMakeを使ってビルドする
  • Visual Studioを使ってデバッグする
  • MSYS2/MinGWを使わない(Pathを通さない)
  • OSSライブラリをリンクする
    • PROJ
    • googletest
  • Linuxでも同じアプリをビルドできるようにすることが次の目標であることを念頭に

参考情報

開発 次郎 さんが6ヶ月前に更新

開発 次郎 さんが3ヶ月前に更新

  • 題名Intel C++ Compiler から Windows下でMinGWを使わず、Intel C++ Compiler(oneAPI)だけでサードパーティをリンクしたプログラムが作れるか? に変更

開発 次郎 さんが3ヶ月前に更新

  • 題名Windows下でMinGWを使わず、Intel C++ Compiler(oneAPI)だけでサードパーティをリンクしたプログラムが作れるか? から Windows下でMinGWを使わず、Intel C++ Compiler(oneAPI)とCMakeを使ってPROJ等サードパーティをリンクしたプログラムが作れるか? に変更

開発 次郎 さんが3ヶ月前に更新

開発 次郎 さんが3ヶ月前に更新

開発 次郎 さんが3ヶ月前に更新 · 編集済み

調査メモ

  • WindowsでC/C++を使う場合は、 icx-cl を使う
    • icx は Linux* 向けのデフォルトの (推奨) ドライバーです。
    • icx-cl は、icx の Microsoft* 互換のドライバーです。

開発 次郎 さんが3ヶ月前に更新 · 編集済み

調査メモ

SYCL(シクル)について

  • SYCL(Standard C++ for Heterogeneous Computing) は、Khronos Groupによって策定されたオープンな標準で、CPU、GPU、FPGAなどの異なるハードウェア上で並列処理を記述するためのC++ライブラリです。
  • SYCLの特徴
    • C++ベース:テンプレート、ラムダ式、クラスなど、C++の機能を活用可能。
    • ヘテロジニアス対応:CPU、GPU、FPGAなど、複数のデバイスに対応。
    • シングルソース:ホストとデバイスのコードを同じソースファイルに記述可能。
    • オープンスタンダード:Khronos Groupによる標準化、複数のベンダーが実装可能。
  • SYCLとoneAPIの関係
    コンポーネント 役割
    DPC++ (Data Parallel C++) Intelが拡張したSYCLの実装。SYCL + Intel独自の機能(USMなど)
    oneAPI DPC++を含むツールチェーン全体(コンパイラ、ライブラリ、デバッガなど)
    SYCL oneAPIの中核となるプログラミングモデル
  • SYCLで書かれたコードの例(DPC++)
    #include <CL/sycl.hpp>
    using namespace sycl;
    
    int main() {
        queue q;
        const int N = 1024;
        std::vector<int> data(N, 1);
    
        buffer<int> buf(data.data(), range<1>(N));
    
        q.submit([&](handler& h) {
            auto acc = buf.get_access<access::mode::read_write>(h);
            h.parallel_for(range<1>(N), [=](id<1> i) {
                acc[i] *= 2;
            });
        });
    
        q.wait();
        // data は 2 に更新される
    }
    

開発 次郎 さんが3ヶ月前に更新 · 編集済み

調査メモ

CMakeによるoneAPIビルド

CMAKE_C_COMPILERにicxを、CMAKE_CXX_COMPILERにicpxを指定します。
find_packageでIntelSYCLパッケージを読み込みます(古い記事だとIntelDPCPPとなっていますが、これはDeprecatedになりました)。
SYCLのカーネルが含まれるcppファイルを、add_sycl_to_targetで指定します。
target_compile_optionsとtarget_link_optionsで-fsycl-targetsを指定します。

以下サンプルです。

set(CMAKE_CXX_COMPILER icpx)
set(CMAKE_C_COMPILER icx)
cmake_minimum_required(VERSION 3.25)
project(main LANGUAGES CXX)
find_package(IntelSYCL REQUIRED)
add_executable(main main.cpp)
add_sycl_to_target(TARGET main SOURCES main.cpp)
target_compile_options(main PRIVATE
    -fsycl-targets=spir64,nvptx64-nvidia-cuda)
target_link_options(main PRIVATE
    -fsycl-targets=spir64,nvptx64-nvidia-cuda)

開発 次郎 さんが3ヶ月前に更新 · 編集済み

試行メモ

zlibをマイクロソフトCMakeでビルドしてみる。

実行結果

出典より

  • CMakeCache.txt CMakeFiles
    Generate a Project Buildsystem の時に作成されます。再作成する時に消す必要があります。
    –fresh オプションをつけると再作成されます。
    cmake -G "Visual Studio 16 2019" -A x64 --fresh
    
  • cl : コマンド ライン error D8021: 数値型引数 '/Werror’ は無効です。
    cl コンパイラーでは無効なオプションですCMakeLists.txt の行をコメントにして回避します。

開発 次郎 さんが3ヶ月前に更新 · 編集済み

  • ステータス新規 から 進行中 に変更

試行メモ

PROJ(PROJ 5.2.0。5系最後のバージョン)をWindowsのみでビルドしてみる。

PythonがいるらしいのでWindows版のPythonをインストールすることにする

Python3.12をインストールした

  • oneAPIでビルドしてみた
    D:\temp\proj-5.2.0\proj-5.2.0\build>"D:\Tools\oneAPI\setvars.bat" 
    D:\temp\proj-5.2.0\proj-5.2.0\build>cmake -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx --fresh -B build -S .
    (省略)
    D:\temp\proj-5.2.0\proj-5.2.0\build>cmake -build . --config Release
    

動的ライブラリが生成できていない

開発 次郎 さんが3ヶ月前に更新

TODO

oneAPIを使って、動的ライブラリを生成する。

他の形式にエクスポート: Atom PDF