diff --git a/CUDADataFormats/Common/test/test_CUDAProduct.cc b/CUDADataFormats/Common/test/test_CUDAProduct.cc index b81ef5d3fa39a..3eb3115571813 100644 --- a/CUDADataFormats/Common/test/test_CUDAProduct.cc +++ b/CUDADataFormats/Common/test/test_CUDAProduct.cc @@ -30,7 +30,9 @@ TEST_CASE("Use of CUDAProduct template", "[CUDACore]") { auto bar = std::move(foo); } - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } constexpr int defaultDevice = 0; cudaCheck(cudaSetDevice(defaultDevice)); diff --git a/HeterogeneousCore/CUDACore/test/test_CUDAScopedContext.cc b/HeterogeneousCore/CUDACore/test/test_CUDAScopedContext.cc index 451538ced1b50..219e4dfb20103 100644 --- a/HeterogeneousCore/CUDACore/test/test_CUDAScopedContext.cc +++ b/HeterogeneousCore/CUDACore/test/test_CUDAScopedContext.cc @@ -39,7 +39,9 @@ namespace { } // namespace TEST_CASE("Use of CUDAScopedContext", "[CUDACore]") { - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } constexpr int defaultDevice = 0; { diff --git a/HeterogeneousCore/CUDATest/python/prod1_cff.py b/HeterogeneousCore/CUDATest/python/prod1_cff.py deleted file mode 100644 index b15847fb3d935..0000000000000 --- a/HeterogeneousCore/CUDATest/python/prod1_cff.py +++ /dev/null @@ -1,15 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from HeterogeneousCore.CUDATest.prod1CPU_cfi import prod1CPU as _prod1CPU -from HeterogeneousCore.CUDATest.prod1CUDA_cfi import prod1CUDA -from HeterogeneousCore.CUDATest.prod1FromCUDA_cfi import prod1FromCUDA as _prod1FromCUDA - -from Configuration.ProcessModifiers.gpu_cff import gpu - -prod1 = _prod1CPU.clone() -gpu.toReplaceWith(prod1, _prod1FromCUDA) - -prod1Task = cms.Task( - prod1CUDA, - prod1 -) diff --git a/HeterogeneousCore/CUDATest/python/prod5_cff.py b/HeterogeneousCore/CUDATest/python/prod5_cff.py deleted file mode 100644 index 2ced616802f9c..0000000000000 --- a/HeterogeneousCore/CUDATest/python/prod5_cff.py +++ /dev/null @@ -1,15 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from HeterogeneousCore.CUDATest.prod5CPU_cfi import prod5CPU as _prod5CPU -from HeterogeneousCore.CUDATest.prod5CUDA_cfi import prod5CUDA -from HeterogeneousCore.CUDATest.prod5FromCUDA_cfi import prod5FromCUDA as _prod5FromCUDA - -from Configuration.ProcessModifiers.gpu_cff import gpu - -prod5 = _prod5CPU.clone() -gpu.toReplaceWith(prod5, _prod5FromCUDA) - -prod5Task = cms.Task( - prod5CUDA, - prod5 -) diff --git a/HeterogeneousCore/CUDATest/python/prod6CPU_cfi.py b/HeterogeneousCore/CUDATest/python/prod6CPU_cfi.py index 1cb1bba3f12b1..a6fadc65195db 100644 --- a/HeterogeneousCore/CUDATest/python/prod6CPU_cfi.py +++ b/HeterogeneousCore/CUDATest/python/prod6CPU_cfi.py @@ -1,4 +1,4 @@ import FWCore.ParameterSet.Config as cms from HeterogeneousCore.CUDATest.testCUDAProducerCPU_cfi import testCUDAProducerCPU as _testCUDAProducerCPU -prod6CPU = _testCUDAProducerCPU.clone(src = "prod5CPU") +prod6CPU = _testCUDAProducerCPU.clone(src = "prod5") diff --git a/HeterogeneousCore/CUDATest/python/prod6_cff.py b/HeterogeneousCore/CUDATest/python/prod6_cff.py deleted file mode 100644 index 9847cd896ce5b..0000000000000 --- a/HeterogeneousCore/CUDATest/python/prod6_cff.py +++ /dev/null @@ -1,16 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from HeterogeneousCore.CUDATest.prod6CPU_cfi import prod6CPU as _prod6CPU -from HeterogeneousCore.CUDATest.prod6CUDA_cfi import prod6CUDA -from HeterogeneousCore.CUDATest.prod6FromCUDA_cfi import prod6FromCUDA as _prod6FromCUDA - -from Configuration.ProcessModifiers.gpu_cff import gpu - -prod6 = _prod6CPU.clone() -gpu.toReplaceWith(prod6, _prod6FromCUDA) - -prod6Task = cms.Task( - prod6CUDA, - prod6 -) - diff --git a/HeterogeneousCore/CUDATest/test/testCUDASwitch_cfg.py b/HeterogeneousCore/CUDATest/test/testCUDASwitch_cfg.py index eef5cd85c3a42..2e213c8a03ede 100644 --- a/HeterogeneousCore/CUDATest/test/testCUDASwitch_cfg.py +++ b/HeterogeneousCore/CUDATest/test/testCUDASwitch_cfg.py @@ -6,7 +6,6 @@ #includeAnalyzer = True includeAnalyzer = False -from Configuration.ProcessModifiers.gpu_cff import gpu process = cms.Process("Test") process.load("FWCore.MessageService.MessageLogger_cfi") process.load("HeterogeneousCore.CUDAServices.CUDAService_cfi") diff --git a/HeterogeneousCore/CUDATest/test/testCUDA_cfg.py b/HeterogeneousCore/CUDATest/test/testCUDA_cfg.py deleted file mode 100644 index 91a73676bcd6d..0000000000000 --- a/HeterogeneousCore/CUDATest/test/testCUDA_cfg.py +++ /dev/null @@ -1,79 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -enableGPU = True - -from Configuration.ProcessModifiers.gpu_cff import gpu -process = cms.Process("Test", gpu) if enableGPU else cms.Process("Test") -process.load("FWCore.MessageService.MessageLogger_cfi") -process.load("HeterogeneousCore.CUDAServices.CUDAService_cfi") - -process.source = cms.Source("EmptySource") - -process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10) ) - -process.options = cms.untracked.PSet( -# numberOfThreads = cms.untracked.uint32(4), - numberOfStreams = cms.untracked.uint32(0) -) -#process.Tracer = cms.Service("Tracer") - -# Flow diagram of the modules -# -# 1 5 -# / \ | -# 2 4 6 -# | -# 3 - -process.load("HeterogeneousCore.CUDATest.prod1_cff") -process.load("HeterogeneousCore.CUDATest.prod5_cff") -process.load("HeterogeneousCore.CUDATest.prod6_cff") - -# CPU producers -from HeterogeneousCore.CUDATest.testCUDAProducerCPU_cfi import testCUDAProducerCPU -process.prod2 = testCUDAProducerCPU.clone(src = "prod1") -process.prod3 = testCUDAProducerCPU.clone(src = "prod2") -process.prod4 = testCUDAProducerCPU.clone(src = "prod1") - -from HeterogeneousCore.CUDATest.testCUDAProducerGPUFirst_cfi import testCUDAProducerGPUFirst -from HeterogeneousCore.CUDATest.testCUDAProducerGPU_cfi import testCUDAProducerGPU -from HeterogeneousCore.CUDATest.testCUDAProducerGPUEW_cfi import testCUDAProducerGPUEW -from HeterogeneousCore.CUDATest.testCUDAProducerGPUtoCPU_cfi import testCUDAProducerGPUtoCPU - -# GPU producers -process.prod2CUDA = testCUDAProducerGPU.clone(src = "prod1CUDA") -process.prod3CUDA = testCUDAProducerGPU.clone(src = "prod2CUDA") -process.prod4CUDA = testCUDAProducerGPUEW.clone(src = "prod1CUDA") - -# Modules to copy data from GPU to CPU (as "on demand" as any other -# EDProducer, i.e. according to consumes() and prefetching). If a -# separate conversion step is needed to get the same data formats as -# the CPU modules, those are then ones that should be replaced-with here. -gpu.toReplaceWith(process.prod2, testCUDAProducerGPUtoCPU.clone(src = "prod2CUDA")) -gpu.toReplaceWith(process.prod3, testCUDAProducerGPUtoCPU.clone(src = "prod3CUDA")) -gpu.toReplaceWith(process.prod4, testCUDAProducerGPUtoCPU.clone(src = "prod4CUDA")) - -process.out = cms.OutputModule("AsciiOutputModule", - outputCommands = cms.untracked.vstring( - "keep *_prod3_*_*", - "keep *_prod4_*_*", - "keep *_prod6_*_*", - ), - verbosity = cms.untracked.uint32(0), -) - -process.prod2Task = cms.Task(process.prod2, process.prod2CUDA) -process.prod3Task = cms.Task(process.prod3, process.prod3CUDA) -process.prod4Task = cms.Task(process.prod4, process.prod4CUDA) - -process.t = cms.Task( - process.prod1Task, - process.prod2Task, - process.prod3Task, - process.prod4Task, - process.prod5Task, - process.prod6Task -) -process.p = cms.Path() -process.p.associate(process.t) -process.ep = cms.EndPath(process.out) diff --git a/HeterogeneousCore/CUDATest/test/test_TestCUDAProducerGPUFirst.cc b/HeterogeneousCore/CUDATest/test/test_TestCUDAProducerGPUFirst.cc index face22a8c3e2e..e52b8e82ca9da 100644 --- a/HeterogeneousCore/CUDATest/test/test_TestCUDAProducerGPUFirst.cc +++ b/HeterogeneousCore/CUDATest/test/test_TestCUDAProducerGPUFirst.cc @@ -25,6 +25,10 @@ process.moduleToTest(process.toTest) SECTION("base configuration is OK") { REQUIRE_NOTHROW(edm::test::TestProcessor(config)); } SECTION("No event data") { + // Calls produce(), so don't call without a GPU + if (not hasCUDADevices()) { + return; + } edm::test::TestProcessor tester(config); REQUIRE_NOTHROW(tester.test()); @@ -59,7 +63,9 @@ process.moduleToTest(process.toTest) )_"}; edm::test::TestProcessor::Config config{baseConfig}; - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } constexpr int defaultDevice = 0; diff --git a/HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h b/HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h index e1260f7cfe187..adb919015d79c 100644 --- a/HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h +++ b/HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h @@ -1,6 +1,8 @@ #ifndef HeterogeneousCore_CUDAUtilities_requireCUDADevices_h #define HeterogeneousCore_CUDAUtilities_requireCUDADevices_h +bool hasCUDADevices(); + void requireCUDADevices(); #endif // HeterogeneousCore_CUDAUtilities_requireCUDADevices_h diff --git a/HeterogeneousCore/CUDAUtilities/src/exitSansCUDADevices.cc b/HeterogeneousCore/CUDAUtilities/src/requireCUDADevices.cc similarity index 82% rename from HeterogeneousCore/CUDAUtilities/src/exitSansCUDADevices.cc rename to HeterogeneousCore/CUDAUtilities/src/requireCUDADevices.cc index ab5cdee0fb8af..a2e9949003a65 100644 --- a/HeterogeneousCore/CUDAUtilities/src/exitSansCUDADevices.cc +++ b/HeterogeneousCore/CUDAUtilities/src/requireCUDADevices.cc @@ -5,17 +5,24 @@ #include "HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h" -void requireCUDADevices() { +bool hasCUDADevices() { int devices = 0; auto status = cudaGetDeviceCount(&devices); if (status != cudaSuccess) { std::cerr << "Failed to initialise the CUDA runtime, the test will be skipped." << "\n"; - exit(EXIT_SUCCESS); + return false; } if (devices == 0) { std::cerr << "No CUDA devices available, the test will be skipped." << "\n"; + return false; + } + return true; +} + +void requireCUDADevices() { + if (not hasCUDADevices()) { exit(EXIT_SUCCESS); } } diff --git a/HeterogeneousCore/CUDAUtilities/test/copyAsync_t.cpp b/HeterogeneousCore/CUDAUtilities/test/copyAsync_t.cpp index 12308ea9b7e5f..0dc6e5d4528f1 100644 --- a/HeterogeneousCore/CUDAUtilities/test/copyAsync_t.cpp +++ b/HeterogeneousCore/CUDAUtilities/test/copyAsync_t.cpp @@ -7,7 +7,9 @@ #include "HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h" TEST_CASE("copyAsync", "[cudaMemTools]") { - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } cudaStream_t stream; cudaCheck(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking)); diff --git a/HeterogeneousCore/CUDAUtilities/test/device_unique_ptr_t.cpp b/HeterogeneousCore/CUDAUtilities/test/device_unique_ptr_t.cpp index 5f4b576d0d302..b3decf337cfa0 100644 --- a/HeterogeneousCore/CUDAUtilities/test/device_unique_ptr_t.cpp +++ b/HeterogeneousCore/CUDAUtilities/test/device_unique_ptr_t.cpp @@ -5,7 +5,9 @@ #include "HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h" TEST_CASE("device_unique_ptr", "[cudaMemTools]") { - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } cudaStream_t stream; cudaCheck(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking)); diff --git a/HeterogeneousCore/CUDAUtilities/test/host_unique_ptr_t.cpp b/HeterogeneousCore/CUDAUtilities/test/host_unique_ptr_t.cpp index a5e81399ab89a..2ba9fd5aefc1c 100644 --- a/HeterogeneousCore/CUDAUtilities/test/host_unique_ptr_t.cpp +++ b/HeterogeneousCore/CUDAUtilities/test/host_unique_ptr_t.cpp @@ -5,7 +5,9 @@ #include "HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h" TEST_CASE("host_unique_ptr", "[cudaMemTools]") { - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } cudaStream_t stream; cudaCheck(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking)); diff --git a/HeterogeneousCore/CUDAUtilities/test/memsetAsync_t.cpp b/HeterogeneousCore/CUDAUtilities/test/memsetAsync_t.cpp index 49d2d7e34dad3..df4fbf52adb3d 100644 --- a/HeterogeneousCore/CUDAUtilities/test/memsetAsync_t.cpp +++ b/HeterogeneousCore/CUDAUtilities/test/memsetAsync_t.cpp @@ -8,7 +8,9 @@ #include "HeterogeneousCore/CUDAUtilities/interface/requireCUDADevices.h" TEST_CASE("memsetAsync", "[cudaMemTools]") { - requireCUDADevices(); + if (not hasCUDADevices()) { + return; + } cudaStream_t stream; cudaCheck(cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking));