SYCLomatic: 新しい CUDA* から SYCL* へのコード移行ツール

同カテゴリーの次の記事

インテル® oneAPI ポーティング・ガイド (dpcpp/icx) 日本語版公開

この記事は、The Parallel Universe Magazine 49 号に掲載されている「SYCLomatic: A New CUDA to SYCL Code Migration Tool」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


parallel_v49_01

CPU、GPU、FPGA、およびその他のアーキテクチャーでハイパフォーマンスと効率的な開発生産性を実現するには、開発者が目の前のタスクに最適なハードウェアを選択できる統一されたプログラミング・モデルが必要です。それには、標準化され、拡張可能な、高水準でオープンスタンダードのヘテロジニアス・プログラミング言語が不可欠です。また、開発者の生産性を向上させるとともに、どのアーキテクチャーでも一貫したパフォーマンスを提供する必要があります。Khronos Group の C++ ベースの SYCL* 標準は、C++ の機能を拡張し、マルチアーキテクチャーとディスジョイント・メモリー構成をサポートすることで、これらの課題に対処しています。

SYCL* の導入を容易にするため、開発者は SYCL* の開発をゼロから始めるのではなく、既存の CUDA* GPU コードを移行したいと考えるかもしれません。以前、インテル® DPC++ 互換性ツール (インテル® DPCT) を使用して CUDA* から SYCL* へ移行する記事を掲載しました。このツールは、インテル® oneAPI ベース・ツールキットに含まれており、インテルのテクニカル・コンサルティング・エンジニアによってサポートされています。

SYCLomatic オープンソース・プロジェクト

この互換性ツールは、開発者の要望に応え、「SYCLomatic」という名前でオープンソース・プロジェクトとしてリリースされています。多くの組織がこのツールを使用しており、一部の組織ではその機能を強化し、カスタマイズして自分たちのニーズに合わせてチューニングしています。その 1 つがアルゴンヌ国立研究所です。

「CRK-HACC は、現在活発に開発が行われている宇宙論的 N 体シミュレーション・コードです。Aurora の準備のため、インテル® DPC++ 互換性ツールを使用して、20 以上の (CUDA*) カーネルを SYCL* に素早く移行できました。コード移行ツールの現在のバージョンはファンクターへの移行をサポートしていないため、簡単な Clang ツールを記述して、生成された SYCL* ソースコードをニーズに合うようにリファクタリングしています。オープンソースの SYCLomatic プロジェクトでは、私たちのこれまでの研究を統合して、より堅牢なソリューションを提供し、ファンクターを利用可能な移行オプションにすることを計画しています。」

アルゴンヌ国立研究所
宇宙物理学 & 先進コンピューティング
HACC (Hardware/Hybrid Accelerated Cosmology Code)
Steve (Esteban) Rangel 氏

LLVM 例外付き Apache* 2.0 ライセンスを利用し、GitHub* でホストされている SYCLomatic プロジェクトは、CPU、GPU、FPGA 向けのオープンなヘテロジニアス開発を推進するため、開発者が貢献したり、フィードバックを送ることができるコミュニティーを用意しています。GitHub* ポータルにある「CONTRIBUTING.md」というガイドで、プロジェクトへの技術的貢献の手順が説明されています。開発者の皆さん、ぜひ本ツールを使用し、ツールを進化させるためフィードバックや貢献をお寄せください。このオープンソース・プロジェクトは、SYCL* 標準の採用を推進するコミュニティーに協力でき、開発者を単一ベンダーの独占的エコシステムから解放する重要なステップとなります。SYCLomatic に加えられた改善点は、インテル® DPC++ 互換性ツール製品にもフィードバックされます。

SYCLomatic ツールの仕組み

SYCLomatic は、CUDA* から SYCL* への移行を支援し、通常、CUDA* コードの 90 ~ 95% を自動的に SYCL* コードに移行します。開発者は残りのコーディングを手動で行い、ターゲット・アーキテクチャーで求められるパフォーマンスを達成できるようにチューニングします (図 1)。


図 1. SYCLomatic のワークフロー

コード移行の成功例

多くの研究機関やインテルのお客様が、SYCLomatic と同じ技術を持つインテル® DPC++ 互換性ツールを使用して、複数のベンダーのアーキテクチャー上で CUDA* コードから SYCL* (または oneAPI の SYCL* 実装であるデータ並列 C++) への移行に成功しています。例として、ストックホルム大学の GROMACS 2022 (英語)、Zuse Institute Berlin (ZIB) (英語) の easyWave、Samsung Medison (英語)、Bittware (英語) などが挙げられます (その他の例は、oneAPI DevSummit のコンテンツ (英語) を参照してください)。また、アルゴンヌ国立研究所の Aurora スーパーコンピューター (英語)、ライプニッツ・スーパーコンピューティング・センター (LRZ) (英語)、GE Healthcare (英語) など、複数のお客様が現在および将来のインテル® Iris® Xe アーキテクチャー・ベースの GPU でコードをテストしています。

例: CUDA* ベクトル加算の SYCL* への移行

移行プロセスの実用的な概要を説明するため、ここではベクトル加算の簡単な CUDA* 実装を使用します。そして、SYCLomatic が生成するコードを詳しく見ていきます。主に、CUDA* と SYCL* が大きく異なるコードセクションに注目します。 このタスクには、インテル® oneAPI ベース・ツールキットの SYCLomatic とインテル® oneAPI DPC++/C++ コンパイラーを使用します。ツールキットをインストールするには、「インテル® oneAPI インストール・ガイド」 (英語) の手順に従ってください。次のワークフローを使用して、既存の CUDA* アプリケーションを SYCL* へ移行します。

  1. intercept-build ユーティリティーを使用して Makefile が実行するコマンドをインターセプトし、JSON 形式のコンパイル・データベース・ファイルに保存します。このステップは、シングルソースのプロジェクトではオプションです。
  2. SYCLomatic を使用して CUDA* コードを SYCL* へ移行します。
  3. 生成されたコードの正当性を検証し、警告メッセージで明示的に示された場合は、手動で移行を完了します。『インテル® DPC++ 互換性ツール・デベロッパー・ガイドおよびリファレンス』 (英語) を確認して警告を修正します。
  4. インテル® oneAPI DPC++/C++ コンパイラーでコードをコンパイルし、プログラムを実行して、出力を確認します。

その後、インテル® VTune™ プロファイラーを含むインテル® oneAPI の解析およびデバッグツールを使用して、コードをさらに最適化できます。


製品とパフォーマンス情報

1実際の性能は利用法、構成、その他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex (英語) を参照してください。

関連記事

  • SYCL* と DPC++ を始めようSYCL* と DPC++ を始めよう この記事は、インテル® デベロッパー・ゾーンに公開されている「Hello SYCL and DPC++」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 XPU 向けソフトウェア開発に関する本ブログへようこそ。第 1 […]
  • 開発者が実感する oneAPI の価値開発者が実感する oneAPI の価値 この記事は、インテル® デベロッパー・ゾーンに公開されている「Developers Realize the Value of oneAPI」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。 Scott Apeland デベロッパー・リレーションズ […]
  • DPC++ への Codeplay の貢献により NVIDIA* GPU の SYCL* サポートを提供 この記事は 2020 年 2 月 3 日に Codeplay のウェブサイトで公開された「Codeplay contribution to DPC++ brings SYCL support for NVIDIA GPUs」を Codeplay の許可を得て日本語訳したものです。 Codeplay は当初から SYCL* […]
  • ヘテロジニアスな処理にはデータ並列化が必要: SYCL と DPC++ から始めようヘテロジニアスな処理にはデータ並列化が必要: SYCL と DPC++ から始めよう この記事は、インテル® デベロッパー・ゾーンで公開されている「Heterogeneous Processing Requires Data Parallelization: SYCL and DPC++ Are a Good Start」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 [注: […]
  • パート 1: DPC++ と Visual Studio* Code で SYCL* コードをデバッグパート 1: DPC++ と Visual Studio* Code で SYCL* コードをデバッグ この記事は、Codeplay Blogs に公開されている「Debugging SYCL™ code with DPC++ and Visual Studio® Code」の日本語参考訳です。原文は更新される可能性があります、原文と翻訳文の内容が異なる場合原文を優先してください。 この記事の PDF […]