私はCUDAでプログラミングを始めています。いくつかの例では、インクルードファイルcuda.h
、cuda_runtime.h
およびcuda_runtime_api.h
コードに含まれています。誰かがこれらのファイルの違いを私に説明できますか?
非常に広い意味で:
cuda.h
は、CUDAドライバーAPIのパブリックホスト関数とタイプを定義します。cuda_runtime_api.h
は、CUDAランタイムAPIのパブリックホスト関数とタイプを定義しますcuda_runtime.h
は、cuda_runtime_api.h
が行うすべてのこと、およびCUDA言語拡張とデバイス組み込み関数の組み込み型定義と関数オーバーレイを定義します。API呼び出しを含むホストコンパイラーでコンパイルされるホストコードを記述している場合は、cuda.h
またはcuda_runtime_api.h
のいずれかを含めます。タイプなどの他のCUDA言語の組み込みが必要で、ランタイムAPIを使用してホストコンパイラーでコンパイルする場合は、cuda_runtime.h
を含めます。 nvccを使用してコンパイルされるコードを記述している場合、プログラマーの介入なしにnvccがすべての必要なヘッダーの組み込みを自動的に処理するため、それはすべて無関係です。
@talonmiesの回答にいくつかの所見を追加したいと思います。
cuda_runtime.h
_は内部的に_cuda_runtime_api.h
_を含みますが、逆は含みません。したがって、「runtimeにはすべてのruntime_apiが含まれます」は覚えておくべきニーモニックです。cuda_runtime_api.h
_には、公式ドキュメントにあるランタイムAPI関数全体が含まれていませんが、_cuda_runtime.h
_ willにはすべて含まれています(例:cudaEventCreate()
) 。ただし、_cuda_runtime.h
_で定義されたすべてのAPI呼び出しは、_cuda_runtime_api.h
_の関数の呼び出しを使用して、ヘッダーファイル自体に実際に実装されます。これらは、@ talonmiesが言及した「関数オーバーレイ」です。cuda_runtime.h
_は、C言語関数宣言のみを含むC言語ヘッダー(IIANM)です。 _cuda_runtime.h
_は、いくつかのテンプレート関数が実装されたC++ヘッダーファイルです。