CUDA: Allow -G to control device debuging on MSVC.

Fixes #17551
This commit is contained in:
Robert Maynard 2017-12-21 17:30:40 -05:00
parent 1f29bc4092
commit dcc606ad47
4 changed files with 97 additions and 1 deletions

View File

@ -2680,6 +2680,12 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions(
cudaOptions.Parse(defineFlags.c_str());
cudaOptions.ParseFinish();
// If we haven't explicitly enabled GPU debug information
// explicitly disable it
if (!cudaOptions.HasFlag("GPUDebugInfo")) {
cudaOptions.AddFlag("GPUDebugInfo", "false");
}
if (this->GeneratorTarget->GetPropertyAsBool("CUDA_SEPARABLE_COMPILATION")) {
cudaOptions.AddFlag("GenerateRelocatableDeviceCode", "true");
} else if (this->GeneratorTarget->GetPropertyAsBool(

View File

@ -1,6 +1,7 @@
ADD_TEST_MACRO(CudaOnly.EnableStandard CudaOnlyEnableStandard)
ADD_TEST_MACRO(CudaOnly.ExportPTX CudaOnlyExportPTX)
ADD_TEST_MACRO(CudaOnly.GPUDebugFlag CudaOnlyGPUDebugFlag)
ADD_TEST_MACRO(CudaOnly.ResolveDeviceSymbols CudaOnlyResolveDeviceSymbols)
ADD_TEST_MACRO(CudaOnly.SeparateCompilation CudaOnlySeparateCompilation)
ADD_TEST_MACRO(CudaOnly.WithDefs CudaOnlyWithDefs)
ADD_TEST_MACRO(CudaOnly.ResolveDeviceSymbols CudaOnlyResolveDeviceSymbols)

View File

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 3.7)
project (CudaOnlGPUDebugFlag CUDA)
#Goal for this example:
#verify that -G enables gpu debug flags
string(APPEND CMAKE_CUDA_FLAGS " -gencode=arch=compute_30,code=compute_30")
string(APPEND CMAKE_CUDA_FLAGS " -G")
set(CMAKE_CUDA_STANDARD 11)
add_executable(CudaOnlyGPUDebugFlag main.cu)
if(CMAKE_CUDA_COMPILER_VERSION VERSION_LESS 9.0.0)
#CUDA's __CUDACC_DEBUG__ define was added in 9.0
#so if we are below 9.0.0 we will manually add the define so that the test
#passes
target_compile_definitions(CudaOnlyGPUDebugFlag PRIVATE "__CUDACC_DEBUG__")
endif()
if(APPLE)
# Help the static cuda runtime find the driver (libcuda.dyllib) at runtime.
set_property(TARGET CudaOnlyGPUDebugFlag PROPERTY BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
endif()

View File

@ -0,0 +1,66 @@
#include <cuda.h>
#include <cuda_runtime.h>
#include <iostream>
static __global__ void debug_kernel(bool* has_debug)
{
// Verify using the return code if we have GPU debug flag enabled
#if defined(__CUDACC__) && defined(__CUDACC_DEBUG__)
*has_debug = true;
#else
*has_debug = false;
#endif
}
int choose_cuda_device()
{
int nDevices = 0;
cudaError_t err = cudaGetDeviceCount(&nDevices);
if (err != cudaSuccess) {
std::cerr << "Failed to retrieve the number of CUDA enabled devices"
<< std::endl;
return 1;
}
for (int i = 0; i < nDevices; ++i) {
cudaDeviceProp prop;
cudaError_t err = cudaGetDeviceProperties(&prop, i);
if (err != cudaSuccess) {
std::cerr << "Could not retrieve properties from CUDA device " << i
<< std::endl;
return 1;
}
if (prop.major >= 3) {
err = cudaSetDevice(i);
if (err != cudaSuccess) {
std::cout << "Could not select CUDA device " << i << std::endl;
} else {
return 0;
}
}
}
std::cout << "Could not find a CUDA enabled card supporting compute >=3.0"
<< std::endl;
return 1;
}
int main(int argc, char** argv)
{
bool* has_debug;
cudaError_t err = cudaMallocManaged(&has_debug, sizeof(bool));
debug_kernel<<<1, 1>>>(has_debug);
err = cudaDeviceSynchronize();
if (err != cudaSuccess) {
std::cerr << "debug_kernel: kernel launch shouldn't have failed\n"
<< "reason:\t" << cudaGetErrorString(err) << std::endl;
return 1;
}
if (*has_debug == false) {
std::cerr << "debug_kernel: kernel not compiled with device debug"
<< std::endl;
return 1;
}
return 0;
}