不安定なCUDAモジュール

Since: 0.50.0

このモジュールは、CUDA Toolkitと、それを用いたコードのビルドに関連するヘルパー機能を提供します。

注意: このモジュールは不安定です。テクノロジー プレビューとしてのみ提供されています。そのAPIはリリース間で任意の方法で変更される可能性があり、Mesonから完全に削除される可能性もあります。

モジュールのインポート

モジュールは以下の様にインポートできます。

cuda = import('unstable-cuda')

このモジュールは、以下に列挙されているいくつかの便利な関数を提供します。

関数

nvcc_arch_flags()

Since: 0.50.0

cuda.nvcc_arch_flags(cuda_version_string, ...,
                     detected: string_or_array)

位置引数で列挙されたアーキテクチャ/コンピュート能力に対して「ファットバイナリ」をコンパイルするために、cuda_args:に渡す必要がある-gencodeフラグのリストを返します。これらのフラグは、CUDA Toolkitバージョン文字列cuda_version_stringを持つNVCCで受け入れられる必要があります。

アーキテクチャとコンピュート能力のセットは、以下のように指定できます。

  • 単一の位置引数'All''Common'、または'Auto'
  • (文字列の配列として)
    • アーキテクチャ名('Kepler''Maxwell+Tegra''Turing')や
    • コンピュート能力('3.0''3.5''5.3''7.5')

+PTXのサフィックスは、指定されたアーキテクチャに対するPTXコードの生成を要求します。A.B(X.Y)として指定されたコンピュート能力は、新しいアーキテクチャA.Bに対するバイナリ生成の前に、古い仮想アーキテクチャX.Yに対するPTX生成を要求します。

複数のアーキテクチャとコンピュート能力は、以下を使用して渡すことができます。

  • 複数位置引数
  • 文字列のリスト
  • スペース( )、コンマ(,)、またはセミコロン(;)で区切られた文字列

単一単語のアーキテクチャセット'All''Common'、または'Auto'は、アーキテクチャ名またはコンピュート能力と混合することはできません。それらの解釈は以下の通りです。

名前 コンピュート能力
'All' 指定されたNVCCコンパイラでサポートされているすべてのCC。
'Common' 指定されたNVCCコンパイラでサポートされている比較的一般的なCC。一般的に、TegraおよびTeslaデバイスは除外されます。
'Auto' detected:キーワードによって提供されるCCで、指定されたNVCCコンパイラによるサポートがフィルタリングされています。

サポートされているアーキテクチャ名とその対応するコンピュート能力は以下のとおりです。

名前 コンピュート能力
'Fermi' 2.0, 2.1(2.0)
'Kepler' 3.0, 3.5
'Kepler+Tegra' 3.2
'Kepler+Tesla' 3.7
'Maxwell' 5.0, 5.2
'Maxwell+Tegra' 5.3
'Pascal' 6.0, 6.1
'Pascal+Tegra' 6.2
'Volta' 7.0
'Xavier' 7.2
'Turing' 7.5
'Ampere' 8.0, 8.6

cuda.nvcc_arch_flags('10.0', '3.0', '3.5', '5.0+PTX')
cuda.nvcc_arch_flags('10.0', ['3.0', '3.5', '5.0+PTX'])
cuda.nvcc_arch_flags('10.0', [['3.0', '3.5'], '5.0+PTX'])
cuda.nvcc_arch_flags('10.0', '3.0 3.5 5.0+PTX')
cuda.nvcc_arch_flags('10.0', '3.0,3.5,5.0+PTX')
cuda.nvcc_arch_flags('10.0', '3.0;3.5;5.0+PTX')
cuda.nvcc_arch_flags('10.0', 'Kepler 5.0+PTX')
# Returns ['-gencode', 'arch=compute_30,code=sm_30',
#          '-gencode', 'arch=compute_35,code=sm_35',
#          '-gencode', 'arch=compute_50,code=sm_50',
#          '-gencode', 'arch=compute_50,code=compute_50']

cuda.nvcc_arch_flags('10.0', '3.5(3.0)')
# Returns ['-gencode', 'arch=compute_30,code=sm_35']

cuda.nvcc_arch_flags('8.0', 'Common')
# Returns ['-gencode', 'arch=compute_30,code=sm_30',
#          '-gencode', 'arch=compute_35,code=sm_35',
#          '-gencode', 'arch=compute_50,code=sm_50',
#          '-gencode', 'arch=compute_52,code=sm_52',
#          '-gencode', 'arch=compute_60,code=sm_60',
#          '-gencode', 'arch=compute_61,code=sm_61',
#          '-gencode', 'arch=compute_61,code=compute_61']

cuda.nvcc_arch_flags('9.2', 'Auto', detected: '6.0 6.0 6.0 6.0')
cuda.nvcc_arch_flags('9.2', 'Auto', detected: ['6.0', '6.0', '6.0', '6.0'])
# Returns ['-gencode', 'arch=compute_60,code=sm_60']

cuda.nvcc_arch_flags(nvcc, 'All')
# Returns ['-gencode', 'arch=compute_20,code=sm_20',
#          '-gencode', 'arch=compute_20,code=sm_21',
#          '-gencode', 'arch=compute_30,code=sm_30',
#          '-gencode', 'arch=compute_32,code=sm_32',
#          '-gencode', 'arch=compute_35,code=sm_35',
#          '-gencode', 'arch=compute_37,code=sm_37',
#          '-gencode', 'arch=compute_50,code=sm_50', # nvcc.version()  <  7.0
#          '-gencode', 'arch=compute_52,code=sm_52',
#          '-gencode', 'arch=compute_53,code=sm_53', # nvcc.version() >=  7.0
#          '-gencode', 'arch=compute_60,code=sm_60',
#          '-gencode', 'arch=compute_61,code=sm_61', # nvcc.version() >=  8.0
#          '-gencode', 'arch=compute_70,code=sm_70',
#          '-gencode', 'arch=compute_72,code=sm_72', # nvcc.version() >=  9.0
#          '-gencode', 'arch=compute_75,code=sm_75'] # nvcc.version() >= 10.0

注記: この関数は、CMakeのFindCUDAモジュールの関数CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])を綿密に複製することを意図しています。

nvcc_arch_readable()

Since: 0.50.0

cuda.nvcc_arch_readable(cuda_version_string, ...,
                        detected: string_or_array)

nvcc_arch_flags()とまったく同じインターフェースを持っていますが、フラグのリストを返すのではなく、コンパイルされるアーキテクチャの「読みやすい」リストを返します。この関数の出力は、情報メッセージの印刷のみに意図されています。

archs    = '3.0 3.5 5.0+PTX'
readable = cuda.nvcc_arch_readable('10.0', archs)
message('Building for architectures ' + ' '.join(readable))

これは以下を出力します。

Message: Building for architectures sm30 sm35 sm50 compute50

注記: この関数は、CMakeのFindCUDAモジュールの関数CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])を綿密に複製することを意図しています。

min_driver_version()

Since: 0.50.0

cuda.min_driver_version(cuda_version_string)

指定されたバージョン文字列のCUDA Toolkitでコンパイルされたカーネルによって、ホストシステムで必要とされる最小のNVIDIA独自のドライバーバージョンを返します。

この関数の出力は、一般的に情報メッセージの印刷を目的としていますが、アサーションに使用したり、最小限必要なNVIDIAドライバー内に存在することがわかっている機能を条件付きで有効にするために使用することもできます。

検索の結果は、