この記事は、CodePlay 社の許可を得て iSUS (IA Software User Society) が作成した 2022年12月16日時点の「Bringing Nvidia® and AMD support to oneAPI」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
SYCL* コードを記述して、oneAPI と無料のバイナリープラグインで NVIDIA* GPU と AMD* GPU をターゲットにすることが可能に
CodePlay は NVIDIA* GPU および AMD* GPU の oneAPI プラグインを技術サポートとともに正式にリリースしました。これはマイルストーンであり、詳細は正式発表 (英語) をご覧ください。私は、このプロジェクトに当初から携わってきましたが、私たちチームにとって、幅広い開発者コミュニティーで利用できるようになることは大変喜ばしいことです。このリリースでは、インテル® oneAPI ツールキットのインテル® DPC++/C++ コンパイラー向けのプラグインを提供し、NVIDIA* GPU と AMD* GPU プラットフォームのターゲットを利用できるようにします。NVIDIA* GPU および AMD* GPU のサポートは、DPC++ オープンソース・リポジトリーでしばらく前から利用できましたが、これは最初の公式バイナリーリリースとなります。CodePlay は、このリリースとともに、技術的な問題に対する迅速なサポートと、NVIDIA プラットフォームで oneAPI を展開することに関するサポートについて、当社のチームとの直接コンタクトを希望されるお客様向けに、商用の「優先サポート」パッケージを提供しています。
この新しいリリースをすぐに利用したい開発者は、NVIDIA* GPU 向け導入ガイドまたは AMD* GPU 向け導入ガイドをご覧ください。「機能」の節で、このプラグインでサポートされる機能とサポートされない機能を確認できます。
このリリースは、インテル® oneAPI ツールキットを補完するプラグイン・コンポーネントです。インテル® oneAPI ツールキットは、インテル® DPC++/C++ コンパイラーで OpenCL* プラグインとレベルゼロプラグインを提供していますが、CodePlay は NVIDIA* GPU および AMD* GPU プラットフォームのサポートを追加します。CodePlay のプラグインを使用するには、インテル® oneAPI ベース・ツールキットがインストールされている必要があり、単独では利用できません。
CodePlay のプラグインは、インテル® oneAPI ツールキットと同じタイミングでリリースされます。最初のバージョンは 2023.0 であり、最新の CUDA* および ROCm* SDK のリリースに対応するため、追加のマイナーリリースがあります。マイナーリリースを適用することで、最新のプラットフォーム・ドライバーで確実に動作するようになります。
2023.0 リリースでは、ほとんどの SYCL* 2020 の機能が oneAPI for NVIDIA* GPU に実装されています。
oneAPI for NVIDIA* GPU は、CUDA* SDK 11.7 と推奨ドライバーを使用して、主に NVIDIA* A100 GPU をサポートします。ただし、計算機能 (CC) が sm_50 (MaxWell – GTX750/900) 以上の GPU であれば動作するはずです。
oneAPI for AMD* GPU はまだベータ段階ですが、SYCL* 2020 機能の 50% 以上を実装しています。
oneAPI for AMD* GPU プラグインは、ROCm* 4.5.2 と AMD* W6800 GPU (gfx1030) を搭載した環境でサポートされています。だたし、AMD* MI50 (gfx906)、MI100 (gfx908) および Radeon* RX 6700 XT (gfx1031) GPU でも定期的にテストを行っています。
各種 GPU でこのプラグインを使用したコミュニティーからの評価の声をお待ちしています。
サポートされる機能
NVIDIA* GPU プラグインでは、各種レベルの統合共有メモリー (USM)、サブグループ・アルゴリズム、アトミック、リダクション操作など、主要な SYCL* 2020 の機能がサポートされています。いくつかの高度な SYCL* 機能も動作し、CUDA* に効率良くマッピングされます。例えば、NVIDIA* Tensor コアは、インテルの「joint_matrix」機能を使用して、インテル® アドバンスト・マトリクス・エクステンション (インテル® AMX) など、同様のインテル・ハードウェア機能と同じパフォーマンス移植性を備えたコードを利用できます。
NVIDIA* GPU または AMD* GPU プラグインを使用する SYCL* アプリケーションは、ほかの CUDA* および HIP アプリケーションと同じ実行パスを使用します。プロファイラー (nsys、ncu) やデバッガー (cuda-gdb) などの従来の NVIDIA* ツールは、データ並列 C++ (DPC++) を使用する SYCL* アプリケーションでも使用できます。上級ユーザーは、生成された PTX をコンパイラーのパイプラインから抽出して、潜在的な低レベルの最適化を特定でき、PTX は CUDA* ネイティブツールを使用して SASS に 変換されます。
バックエンドの相互運用性は、SYCL* 2020 仕様の重要な機能であり、oneAPI for AMD* GPU プラグインでは完全にサポートされています。ユーザーは、ほぼすべての SYCL* オブジェクトからネイティブ CUDA* オブジェクトを生成できます。例えば、SYCL* キューから CUDA* ストリーム、SYCL* イベントから CUDA* イベントなどを生成できます。相互運用モードを使用することで、cuBLAS や cuDNN などのネイティブ CUDA* ライブラリーを SYCL* アプリケーションから利用することができます。
SYCL* では、AMD* や HIP では利用できない機能を実現します。例えば、デバイスと同一の依存関係スケジュールに従って、ホスト上で任意の C++ コードを非同期に実行する機能があります。これは SYCL* ホストタスクによって実現されます。
なぜ、このようなことが可能なのか
oneAPI for NVIDIA* GPU は、CodePlay が過去 3年間、DPC++ オープンソース・リポジトリー (英語) で構築したインフラに依存しています。CodePlay は、複数のバックエンドをターゲットとする SYCL* 2020 機能の利点を活用し、CUDA* による NVIDIA* GPU のサポートと HIP による AMD* GPU のサポートで DPC++ を拡張してきました。CodePlay はまた、CUDA* バックエンド仕様 (英語) を Khronos SYCL* ワーキンググループに提案し、ほかのベンダーが CUDA* に独自の SYCL* 実装を提供できるようにしました。
ローレンスバークレー国立研究所、オークリッジ国立研究所、およびアルゴンヌ国立研究所のクラスターでは、1年以上前から DPC++ を使用して NVIDIA* GPU 向けにコンパイルすることが可能でした。CodePlay はこれらの機関と協力して、研究者が Aurora、Frontier、Polaris、および Perlmutter スーパー・コンピューターで実行するコードの準備に取り組んできました。これにより、複数ベンダーのハードウェア・プラットフォーム間でコードを移行することが容易になりました。
NVIDIA* GPU および AMD* GPU ターゲットの DPC++ の実装には 2 つの主要コンポーネントがあります。1 つには、いくつかの clang++ コンパイラーのドライバーパッチが含まれており、もう 1 つはランタイムプラグインを実装します。配布を容易にするため、コンパイラーの変更は、インテル® oneAPI ベース・ツールキットを生成するためにビルドされるコードに統合されています。プラグインはそれとは別にビルドされ、oneAPI for NVIDIA* GPU と oneAPI for AMD* GPU のみが利用可能で、CodePlay 開発者ウェブサイト (英語) からダウンロードできます。スタンドアロンのインテル® oneAPI ツールキットを使用すると、NVIDIA* および AMD* アーキテクチャーをターゲットとする SYCL* アプリケーションをコンパイルできるようになりますが (つまり、ターゲットフラグがコンパイラーによって受け入れられ、コードを生成できますが)、ランタイムプラグインがないと実行できないことに注意してください。
コンパイラー・ドライバーのパッチは、ターゲットトリプルを識別し、LLVM プロジェクトの既存の CUDA* コンパイラーを使用して、デバイスイメージをビルドするアクションをトリガーすることで、DPC++ フロントエンドが NVIDIA* GPU 向けのビルドをできるようにします。
DPC++ フロントエンドは、SYCL* コードをいくつかのパスにプッシュし、次に LLVM から PTX バックエンドを呼び出して SYCL* アプリケーション・カーネルの PTX を生成します。CodePlay のエンジニアは、LLVM PTX バックエンドで生成されたコードのパフォーマンスがネイティブ NVCC コンパイラーと同等であることを保証するため、Tensor コアなどの最新の PTX ISA 機能のサポートを改善しています。アップストリームの LLVM PTX を採用することで、DPC++ NVIDIA* プラグインは、すでに NVIDIA* GPU を採用している開発者によるコミュニティーからの恩恵が得られます。同じ最適化フラグを使用した場合、生成される PTX ISA は通常、ネイティブ NVCC コンパイラーと同等です。NVCC は、DPC++ CUDA* バックエンドで明示しなければならない、いくつかのデフォルトフラグを暗黙的に有効にすることに注意してください。DPC++ CUDA* バックエンドで適切なフラグを有効にする方法はドキュメントを参照してください。
そのほかのコンポーネントは、ランタイムプラグインであり、SYCL* ランタイムが NVIDIA* プラットフォームと AMD* プラットフォーム上のネイティブ API (それぞれ CUDA* と HIP ドライバー) を呼び出せるようにするものです。ランタイムプラグインは、利用可能である場合に SYCL* ランタイムから呼び出される動的ライブラリーです。DPC++ コンパイラーは、oneAPI ディストリビューションの SYCL* ランタイムと自動的にリンクし、NVIDIA* プラグインや AMD* プラグインが利用できる場合、ランタイムがそれらを選択して実行します。アプリケーションが SYCL* デバイスセレクターを使用すると、図 1 に示すように NVIDIA* (または AMD*) デバイスを選択できます。
図 1: CUDA* デバイス検出されるとメッセージを表示する CUDA* デバイスセレクターの例。
CUDA* デバイスが見つからないと、SYCL* キューはエラーをスローします。
今後の予定
2023年中は、最新の NVIDIA* と AMD* の GPU と SDK リリースを引き続きサポートすることで機能を追加し、テストおよびサポートするプラットフォームを拡大していきます。また、オープンソース・プロジェクト (英語) を通したコミュニティーからの貢献も歓迎します。
oneAPI マス・カーネル・ライブラリー (oneMKL) や oneAPI ディープ・ニューラル・ネットワーク・ライブラリー (oneDNN) などの oneAPI 仕様コンポーネントのハードウェア・サポートを充実させていきます。これらのライブラリーについては、cuBLAS、cuDNN、hipBLAS および hipDNN のサポートを通して正式リリースを準備し、適切にサポートされるようにし、「優先サポート」で重要な問題に対処できるようにします。
将来的には、oneAPI DPC++ ライブラリー (oneDPL) などの oneAPI ライブラリーで複数ベンダーのハードウェアをサポートし、NVIDIA* や AMD* ハードウェアを利用する開発者が SYCL* にシームレスに移行できるように支援したいと考えています。
使用を開始しましょう
NVIDIA* または AMD* プラットフォーム用の C++ SYCL* コンパイラーを使用する場合でも、導入ガイド (英語) を参考にインテルの LLVM リポジトリー (英語) からソースコードを入手して自身でビルドできます。これは、最新の機能を利用する近道です。オープンソース・コミュニティーに問い合わせを行ったり、問題を提起することができます。すべての NVIDIA* および AMD* 開発のサポートは、最初にオープンソース・プロジェクトで行われます。CodePlay は、強力なコミュニティーのバックアップを得て、複数のプラットフォームで oneAPI サポートを提供するオープン・エコシステムを広めることにコミットしています。
また、開発者向けウェブサイトからプラグインをダウンロードし、CodePlay に問い合わせ (英語) て、優先サポートを要求することもできます。
技術的な質問がある場合は、コミュニティー・フォーラム (英語) で問い合わせてください。
法務上の注意書き
1 性能は、使用状況、構成、その他の要因によって異なります。
性能の測定結果はシステム構成の日付時点のテストに基づいています。また、現在公開中のすべてのセキュリティー・アップデートが適用されているとは限りません。 絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。
実際の費用と結果は異なる場合があります。
インテルのテクノロジーを使用するには、対応したハードウェア、ソフトウェア、またはサービスの有効化が必要となる場合があります。
© Codeplay Software Ltd. Intel、インテル、Intel ロゴ、インテルのマーク、Codeplay、Codeplay ロゴは、米国およびその他の国におけるインテル コーポレーションの商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
SYCL は Khronos Group, Inc. の登録商標です。
Codeplay Software Ltd has published this article only as an opinion piece. Although every effort has been made to ensure the information contained in this post is accurate and reliable, Codeplay cannot and does not guarantee the accuracy, validity or completeness of this information. The information contained within this blog is provided “as is” without any representations or warranties, expressed or implied. Codeplay Sofware Ltd makes no representations or warranties in relation to the information in this post.