出力のテキストから判断すると、CMake を使用してサンプルをビルドしているようです。ビルド システムは、PTX ファイルではなくオブジェクト ファイルをコンパイルしたいと考えているようです。表示されているエラー メッセージも、この症状を示しています。
CMake 内から CUDA コードをコンパイルするには、いくつかの方法があります。
CUDA ランタイムを使用している場合は、通常、次の操作を行います。
cuda_add_executable(myprogram main.cpp mycuda.cu myheader.h)
これにより、main.cpp.o と mycuda.cu.o の 2 つのオブジェクト ファイルで構成される myprogram という実行可能ファイルが作成されます。CUDA ランタイムは、cuda ファイル内のコードが CUDA ランタイム API に準拠していることを期待しています。
さらに、実行可能ファイルの代わりにライブラリをコンパイルするcuda_add_executable
ものもあります。cuda_add_library
これらのマクロはどちらもcuda_wrap_srcs
、ビルド コマンドを生成して CUDA コードをコンパイルするまでのほとんどの面倒な作業を行う別のマクロを使用します。特に、このマクロには、CUDA ランタイムを使用するか、PTX のみをターゲットにするかを指定するための引数があります (引数は OBJ または PTX です)。
OptiX シェーダーをコンパイルするには、PTX をターゲットにする必要があります。私たちが出荷する SDK では、これは にある CMake 関数によって処理OPTIX_add_sample_executable
され<install>/SDK/CMakeLists.txt
ます。ほとんどの場合、この関数はcuda_wrap_srcs
PTX オプションを指定して呼び出します。参照用にここにも関数を含めました。
#########################################################
# OPTIX_add_sample_executable
#
# Convenience function for adding samples to the code. You can copy the contents of this
# function into your individual project if you wish to customize the behavior. Note that
# in CMake, functions have their own scope, whereas macros use the scope of the caller.
function(OPTIX_add_sample_executable target_name)
# These calls will group PTX and CUDA files into their own directories in the Visual
# Studio projects.
source_group("PTX Files" REGULAR_EXPRESSION ".+\\.ptx$")
source_group("CUDA Files" REGULAR_EXPRESSION ".+\\.cu$")
# Separate the sources from the CMake and CUDA options fed to the macro. This code
# comes from the CUDA_COMPILE_PTX macro found in FindCUDA.cmake. We are copying the
# code here, so that we can use our own name for the target. target_name is used in the
# creation of the output file names, and we want this to be unique for each target in
# the SDK.
CUDA_GET_SOURCES_AND_OPTIONS(source_files cmake_options options ${ARGN})
# Create the rules to build the PTX from the CUDA files.
CUDA_WRAP_SRCS( ${target_name} PTX generated_files ${source_files} ${cmake_options}
OPTIONS ${options} )
# Here is where we create the rule to make the executable. We define a target name and
# list all the source files used to create the target. In addition we also pass along
# the cmake_options parsed out of the arguments.
add_executable(${target_name}
${source_files}
${generated_files}
${cmake_options}
)
# Most of the samples link against the sutil library and the optix library. Here is the
# rule that specifies this linkage.
target_link_libraries( ${target_name}
sutil
optix
${optix_rpath}
)
endfunction()