CMake で CUDA 拡張機能を有効にする: CMAKE_CUDA_EXTENSIONS と target_properties の比較


CMAKE_CUDA_EXTENSIONS は、CMake におけるターゲットプロパティ CUDA_EXTENSIONS のデフォルト値を設定する変数です。この変数は、CMake 3.8 以降で導入されました。

機能

CMAKE_CUDA_EXTENSIONS は、ターゲットのコンパイル時に使用される CUDA 拡張機能を指定するために使用されます。具体的には、以下の機能を提供します。

  • 複数の CUDA 拡張機能をカンマ区切りで指定する。
  • 個々のターゲットに対して、個別の CUDA 拡張機能を設定する。
  • すべてのターゲットに対して、デフォルトの CUDA 拡張機能を設定する。

設定方法

CMAKE_CUDA_EXTENSIONS は、CMake の設定ファイル (CMakeLists.txt) で以下のいずれかの方法で設定できます。

  • CMake コマンドを使用する
set(CMAKE_CUDA_EXTENSIONS "EXTENSION1;EXTENSION2")
  • target_properties コマンドを使用する
target_properties(mytarget PROPERTIES CUDA_EXTENSIONS "EXTENSION1;EXTENSION2")

以下の例では、すべてのターゲットに対して EXTENSION1EXTENSION2 という CUDA 拡張機能をデフォルトとして設定します。

set(CMAKE_CUDA_EXTENSIONS "EXTENSION1;EXTENSION2")

以下の例では、mytarget というターゲットに対して EXTENSION3 という CUDA 拡張機能を設定します。

target_properties(mytarget PROPERTIES CUDA_EXTENSIONS "EXTENSION3")
  • 複数の CUDA 拡張機能を指定する場合は、カンマ区切りで記述する必要があります。
  • 使用する CUDA 拡張機能は、CUDA コンパイラによってサポートされている必要があります。
  • CMAKE_CUDA_EXTENSIONS は、CMake 3.8 以降でのみ使用できます。
  • CUDA 拡張機能の詳細については、CUDA ドキュメントを参照してください。
  • CMAKE_CUDA_EXTENSIONS は、CUDA 拡張機能を有効にするための便利な方法ですが、個々のターゲットに対して個別に設定する必要がある場合や、複雑な構成が必要な場合は、target_properties コマンドを使用する方が適切な場合があります。


サンプル 1: すべてのターゲットに対してデフォルトの CUDA 拡張機能を設定する

cmake_minimum_required(VERSION 3.8)

project(myproject)

set(CMAKE_CUDA_EXTENSIONS "EXTENSION1;EXTENSION2")

add_executable(myprogram myprogram.cpp)
  1. CMake の最小バージョンを 3.8 に設定します。
  2. myproject という名前のプロジェクトを作成します。
  3. CMAKE_CUDA_EXTENSIONS 変数に EXTENSION1EXTENSION2 という CUDA 拡張機能を設定します。
  4. myprogram.cpp というソースファイルから myprogram という名前の実行可能ファイルを作成します。

このコードを実行すると、myprogram という実行可能ファイルが作成されます。この実行可能ファイルは、EXTENSION1EXTENSION2 という CUDA 拡張機能を使用してコンパイルされます。

サンプル 2: 個々のターゲットに対して個別の CUDA 拡張機能を設定する

cmake_minimum_required(VERSION 3.8)

project(myproject)

set(CMAKE_CUDA_EXTENSIONS_MYTARGET "EXTENSION3")

add_executable(myprogram1 myprogram1.cpp)
add_executable(myprogram2 myprogram2.cpp)

target_properties(myprogram2 PROPERTIES CUDA_EXTENSIONS "EXTENSION4")

このコードは、以下の動作を行います。

  1. CMake の最小バージョンを 3.8 に設定します。
  2. myproject という名前のプロジェクトを作成します。
  3. CMAKE_CUDA_EXTENSIONS_MYTARGET 変数に EXTENSION3 という CUDA 拡張機能を設定します。
  4. myprogram1.cpp というソースファイルから myprogram1 という名前の実行可能ファイルを作成します。
  5. myprogram2.cpp というソースファイルから myprogram2 という名前の実行可能ファイルを作成します。
  6. myprogram2 ターゲットに対して EXTENSION4 という CUDA 拡張機能を設定します。

このコードを実行すると、myprogram1myprogram2 という 2 つの実行可能ファイルが作成されます。myprogram1EXTENSION3 という CUDA 拡張機能を使用してコンパイルされ、myprogram2EXTENSION4 という CUDA 拡張機能を使用してコンパイルされます。

cmake_minimum_required(VERSION 3.8)

project(myproject)

set(CMAKE_CUDA_EXTENSIONS "EXTENSION1;EXTENSION2;EXTENSION3")

add_executable(myprogram myprogram.cpp)
  1. CMake の最小バージョンを 3.8 に設定します。
  2. myproject という名前のプロジェクトを作成します。
  3. CMAKE_CUDA_EXTENSIONS 変数に EXTENSION1EXTENSION2EXTENSION3 という CUDA 拡張機能を設定します。
  4. myprogram.cpp というソースファイルから myprogram という名前の実行可能ファイルを作成します。

このコードを実行すると、myprogram という実行可能ファイルが作成されます。この実行可能ファイルは、EXTENSION1EXTENSION2EXTENSION3 という CUDA 拡張機能を使用してコンパイルされます。

  • CUDA 拡張機能の詳細については、CUDA ドキュメントを参照してください。
  • CMAKE_CUDA_EXTENSIONS は、CUDA 拡張機能を有効にするための便利な方法ですが、個々のターゲットに対して個別に設定する必要がある場合や、複雑な構成が必要な場合は、target_properties コマンドを使用する方が適切な場合があります。


CMAKE_CUDA_EXTENSIONS の代替方法としては、以下の方法が挙げられます。

target_properties コマンドを使用する

target_properties コマンドは、個々のターゲットに対して CUDA 拡張機能を設定するために使用できます。これは、CMAKE_CUDA_EXTENSIONS を使用するよりも柔軟性が高く、個々のターゲットに対して個別の設定が必要な場合や、複雑な構成が必要な場合に適しています。

target_properties(mytarget PROPERTIES CUDA_EXTENSIONS "EXTENSION1;EXTENSION2")

この例では、mytarget というターゲットに対して EXTENSION1EXTENSION2 という CUDA 拡張機能を設定します。

CUDA_NVCC_FLAGS 変数を使用する

CUDA_NVCC_FLAGS 変数は、NVCC コンパイラに渡されるフラグを設定するために使用できます。この変数を使用して、CUDA 拡張機能を有効にするフラグを追加することができます。

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -Xcompiler -Wno-unused-cuda-features")

この例では、-Wno-unused-cuda-features というフラグを NVCC コンパイラに渡します。このフラグは、使用されていない CUDA 拡張機能に関する警告を抑制します。

手動で CUDA 拡張機能をソースコードに含める

CUDA 拡張機能をソースコードに直接含めることもできます。これは、シンプルな場合や、特定の状況でのみ CUDA 拡張機能が必要な場合に適しています。

#include <cuda_runtime.h>

extern "C" {
__global__ void myKernel() {
    // EXTENSION1 と EXTENSION2 を使用するコード
}
}

この例では、EXTENSION1EXTENSION2 を使用する myKernel というカーネル関数を定義しています。

方法利点欠点
target_properties コマンド個々のターゲットに対して個別に設定できる複雑な構成になる場合がある
CUDA_NVCC_FLAGS 変数シンプル特定の状況でのみ有効
手動で CUDA 拡張機能をソースコードに含めるシンプル複雑な CUDA 拡張機能を使用できない

CMAKE_CUDA_EXTENSIONS は、CUDA 拡張機能を有効にするための便利な方法ですが、個々のターゲットに対して個別に設定する必要がある場合や、複雑な構成が必要な場合は、target_properties コマンドを使用する方が適切な場合があります。また、CUDA_NVCC_FLAGS 変数や手動で CUDA 拡張機能をソースコードに含める方法も状況に応じて検討することができます。

  • CUDA 拡張機能の詳細については、CUDA ドキュメントを参照してください。
  • 上記の代替方法はあくまでも例であり、実際の用途に合わせて変更する必要があります。
  • 複数の CUDA 拡張機能を指定する場合は、カンマ区切りで記述する必要があります。
  • 使用する CUDA 拡張機能は、CUDA コンパイラによってサポートされている必要があります。
  • CMAKE_CUDA_EXTENSIONS は、CMake 3.8 以降でのみ使用できます。