Cuda: ResolveDeviceSymbols now properly execute everywhere.

The previous version had two bugs that caused the JIT runtime errors.

1. It was building the executable without separable compilation enabled

2. All kernel launches will fail if any kernel is missing a symbol, that
   is why the call to file2_launch_kernel had to be removed
This commit is contained in:
Robert Maynard
2017-12-13 17:34:48 -05:00
parent 9720c14255
commit 8164298935
2 changed files with 10 additions and 15 deletions
@@ -16,11 +16,11 @@ else()
endif()
#Goal for this example:
#Build a static library that defines multiple methods and kernels that
#use each other.
#Use a custom command to build an executable that uses this static library
#We do these together to verify that we can get a static library to do
#device symbol linking, and not have it done when the executable is made
# Build a static library that defines multiple methods and kernels that
# use each other.
# Resolve the device symbols into that static library
# Verify that we can't use those device symbols from anything that links
# to the static library
string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_30,code=compute_30")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
@@ -43,6 +43,10 @@ add_custom_command(TARGET CUDAResolveDeviceLib POST_BUILD
endif()
add_executable(CudaOnlyResolveDeviceSymbols main.cu)
set_target_properties(CudaOnlyResolveDeviceSymbols
PROPERTIES
CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(CudaOnlyResolveDeviceSymbols PRIVATE CUDAResolveDeviceLib)
if(APPLE)
+1 -10
View File
@@ -62,17 +62,8 @@ int main(int argc, char** argv)
return 0;
}
cudaError_t err;
file2_launch_kernel(42);
err = cudaGetLastError();
if (err != cudaSuccess) {
std::cerr << "file2_launch_kernel: kernel launch failed: "
<< cudaGetErrorString(err) << std::endl;
return 1;
}
main_launch_kernel(1);
err = cudaGetLastError();
cudaError_t err = cudaGetLastError();
if (err == cudaSuccess) {
// This kernel launch should fail as the file2_func was device linked
// into the static library and is not usable by the executable