CUDA* から SYCL* への移行ワークフロー

インテル® oneAPI DPC++ 互換性ツール

この記事は、インテル® デベロッパー・ゾーンに公開されている「Workflow for a CUDA* to SYCL* Migration」の日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。


概要

基本ワークフローを使用して、CUDA* アプリケーションのコードベース全体を SYCL* に移行し、インテル® GPU カーネル向けにコードを最適化します。

対象者

CUDA* 開発に精通しているソフトウェア開発者。

必要条件

インテル® デベロッパー・クラウド (英語) にアクセスできる必要があります。インテル® デベロッパー・クラウドは、インテル® GPU とインテル® oneAPI ソフトウェア・ツール (インテル® oneAPI ベース・ツールキットなど) にアクセスできる無料の仮想サンドボックスです。

ローカルの開発システムを使用する場合、以下が必要です。

移行に役立つ情報は、「CUDA* から C++ with SYCL* へのコード移行」を参照してください。

移行ワークフロー

ステップ 1: CUDA* ソースの移行方法を決定する
ステップ 2: コードを移行する
ステップ 3: ターゲット・ハードウェア向けに最適化する

ステップ 1: CUDA* ソースの移行方法を決定する

SYCL* に移行するには、CUDA* アプリケーションが問題なく動作することを確認します。CUDA* ソースは、次のいずれかの方法で移行できます。

  • インテル® DPC++ 互換性ツール (インテル® DPCT) を使用して SYCL* コードの大部分を自動生成します。

    移行例を見る (英語)

  • 手動で CUDA* ソースを解析し、特定の CUDA* 呼び出しをすべて同等の SYCL* 呼び出しに置き換えます。

インテル® DPCT は通常、コードの 90% ~ 95% を移行し、移行を完了するため手作業が必要なコード領域について警告を生成します1

インテル® DPCT は <dpct/dpct.hpp> ヘッダーファイルで定義されたヘルパー関数を使用します。これは、一部の SYCL* 呼び出しが dpct ヘルパー関数を補助するため追加のレイヤーでラップされているためです。手動で移行した SYCL* コードでは、CUDA* 呼び出しに直接マップされた SYCL* 呼び出しと構文が使用されます。

単純な Vector Add サンプル (英語) をダウンロードして、移行してみてください。

1 2021年9月現在のインテルによる推定。Rodinia、Scalable Heterogeneous Computing (SHOC)、Pennant など、70 種類の HPC ベンチマークとサンプルの測定結果に基づいています。結果は異なることがあります。

ステップ 2: コードを移行する

このステップでは、手動またはインテル® DPCT を使用してソースコードを SYCL* に移行します。移行が完了したら、SYCL* ソースコードの開発作業を続行します。

インテル® DPCT を使用した移行

インテル® DPCT を使用して、既存の CUDA* コードを SYCL* に移行します。このツールは、CUDA* 言語カーネルとライブラリー API 呼び出しを移植し、CUDA* コードの大部分を多様なアーキテクチャーとベンダーに移植可能な SYCL* コードに移行します。

サンプルコードで学ぶ

CUDA* ソースの移行方法を決定するため、以下のリソースを利用できます。

  • Jacobi サンプルの移行ガイド: ヤコビ反復法の CUDA* から SYCL* への移行 (英語)。

    移行プロセスと CUDA* から SYCL* へのマッピングの説明と、移行の詳細な分析が得られます。

  • オリジナルの CUDA* ソースコード: JacobiCUDAGraphs.zip (英語)。

  • インテルが提供する移行された SYCL* ソースコード: Jacobi 反復法ソルバー (英語)。

    サンプルには、ワークフローの各段階の状態を反映した個別のソースが含まれています。

注: SYCL* の詳細とインテル® DPCT によるソースコードの変更については、「ヤコビ反復法の CUDA* から SYCL* への移行」 (英語) を参照してください。Jacobi サンプルを使用した CUDA* と SYCL* のマッピングの技術的な詳細について説明しています。

手動による移行

手動で移行した SYCL* コードは、CUDA* 呼び出しに直接マップされた SYCL* 呼び出しと構文を使用します。この方法は、クリーンで理解しやすい移行コードを提供します。CUDA* コードと SYCL* コードの機能はほぼ同じです。

SYCL* の詳細とインテル® DPCT によるソースコードの変更については、「ヤコビ反復法の CUDA* から SYCL* への移行」 (英語) を参照してください。CUDA* と SYCL* の基本概念、およびコードの移行に不可欠な用語を説明しています。

オフロード、非同期ストリームの設定、メモリー割り当てとコピーの手順は共通ですが、実際の作業はオフロード計算で行われます。CUDA* と SYCL* は、GPU 上で動作するオフロードカーネルの作成に関する基本的な概念を共有しています。類似点と相違点を考慮して以下の概念をマッピングすると、SYCL* 構文が理解しやすいでしょう。

  • CUDA* スレッドブロックと SYCL* ワークグループ
  • 共有ローカルメモリー (SLM) アクセス
  • CUDA* スレッドブロックと SYCL* バリア同期
  • CUDA* 協調グループと SYCL* サブグループ
  • CUDA* ワープ・プリミティブと SYCL* グループ・アルゴリズム
  • CUDA* と SYCL* のアトミック操作

関連情報

ステップ 3: ターゲット・ハードウェア向けに最適化する

この時点で、コードはコンパイルして実行できます。インテル® VTune™ プロファイラーやインテル® Advisor などのインテルのツールを使用して、移行したコードをインテル® GPU 向けに最適化します。これらのツールは、アプリケーションのパフォーマンスを最適化するため改善すべきコード領域を特定するのに役立ちます。どちらのツールにも、最適化戦略を視覚化するのに役立つグラフィカル・ユーザー・インターフェイスがあります。

インテル® VTune™ プロファイラーを使用したパフォーマンス解析

インテル® VTune™ プロファイラーを使用して、アプリケーション・パフォーマンス・ベースラインのスナップショットを作成し、詳しく解析する領域を特定します。

次の操作を行います。

  1. GPU 解析用にシステムを設定 (英語) します。
  2. インテル® VTune™ プロファイラーのコマンドライン・インターフェイスを起動 (英語) します。
  3. パフォーマンス・スナップショット解析を実行 (英語) します。
  4. 結果を表示します。

インテル® Advisor を使用したルーフライン解析

インテル® Advisor を使用して、GPU ルーフライン解析でオフロードコードの実際のパフォーマンスを測定します。CPU コードを評価して、パフォーマンスがハードウェアの最大能力にどれぐらい近づいているか確認できます。

次の操作を行います。

  1. GPU カーネルを解析するため環境を設定 (英語) します。
  2. ルーフライン解析を実行 (英語) します。
  3. 結果を確認してハードウェア・モデルに基づいてスループットを評価 (英語) します。

注: Jacobi サンプルの詳細は、「ヤコビ反復法の CUDA* から SYCL* への移行」 (英語) の「Tools for Performance Analysis」を参照してください。GitHub* にある Jacobi サンプルでは、sycl_migrated_optimized が最適化ステップの出力です。

関連情報

タイトルとURLをコピーしました