diff --git a/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.cc b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.cc index 0c0c8e8591df9..7c9d17a767682 100644 --- a/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.cc +++ b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.cc @@ -13,70 +13,69 @@ the same Layout to access the data on host and print it. */ -#include +#include #include -#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h" + +#include + #include "DataFormats/VertexSoA/interface/ZVertexDevice.h" #include "DataFormats/VertexSoA/interface/ZVertexHost.h" +#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h" +#include "FWCore/Utilities/interface/stringize.h" +#include "HeterogeneousCore/AlpakaInterface/interface/config.h" #include "HeterogeneousCore/AlpakaInterface/interface/devices.h" -#include "HeterogeneousCore/AlpakaInterface/interface/host.h" #include "HeterogeneousCore/AlpakaInterface/interface/memory.h" -#include "HeterogeneousCore/AlpakaInterface/interface/config.h" #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" -using namespace std; +#include "ZVertexSoA_test.h" + using namespace ALPAKA_ACCELERATOR_NAMESPACE; -using namespace reco; -namespace ALPAKA_ACCELERATOR_NAMESPACE { - namespace testZVertexSoAT { - void runKernels(ZVertexSoAView zvertex_view, Queue& queue); +int main() { + // Get the list of devices on the current platform + auto const& devices = cms::alpakatools::devices(); + if (devices.empty()) { + std::cerr << "No devices available for the " EDM_STRINGIZE(ALPAKA_ACCELERATOR_NAMESPACE) " backend, " + "the test will be skipped.\n"; + exit(EXIT_FAILURE); } -} // namespace ALPAKA_ACCELERATOR_NAMESPACE -int main() { - const auto host = cms::alpakatools::host(); - const auto device = cms::alpakatools::devices()[0]; - Queue queue(device); + // Run the test on each device + for (const auto& device : devices) { + Queue queue(device); - // Inner scope to deallocate memory before destroying the stream - { - // Instantiate vertices on device. PortableCollection allocates - // SoA on device automatically. - ZVertexSoACollection zvertex_d(queue); - testZVertexSoAT::runKernels(zvertex_d.view(), queue); + // Inner scope to deallocate memory before destroying the stream + { + // Instantiate vertices on device. PortableCollection allocates + // SoA on device automatically. + ZVertexSoACollection zvertex_d(queue); + testZVertexSoAT::runKernels(zvertex_d.view(), queue); - // Instantate vertices on host. This is where the data will be - // copied to from device. - ZVertexHost zvertex_h(queue); - std::cout << zvertex_h.view().metadata().size() << std::endl; - alpaka::memcpy(queue, zvertex_h.buffer(), zvertex_d.const_buffer()); - alpaka::wait(queue); + // Instantate vertices on host. This is where the data will be + // copied to from device. + ZVertexHost zvertex_h(queue); + std::cout << zvertex_h.view().metadata().size() << std::endl; + alpaka::memcpy(queue, zvertex_h.buffer(), zvertex_d.const_buffer()); + alpaka::wait(queue); - // Print results - std::cout << "idv" - << "\t" - << "zv" - << "\t" - << "wv" - << "\t" - << "chi2" - << "\t" - << "ptv2" - << "\t" - << "ndof" - << "\t" - << "sortInd" - << "\t" - << "nvFinal" << std::endl; + // Print results + std::cout << "idv\t" + << "zv\t" + << "wv\t" + << "chi2\t" + << "ptv2\t" + << "ndof\t" + << "sortInd\t" + << "nvFinal\n"; - for (int i = 0; i < 10; ++i) { - std::cout << (int)zvertex_h.view()[i].idv() << "\t" << zvertex_h.view()[i].zv() << "\t" - << zvertex_h.view()[i].wv() << "\t" << zvertex_h.view()[i].chi2() << "\t" << zvertex_h.view()[i].ptv2() - << "\t" << (int)zvertex_h.view()[i].ndof() << "\t" << (int)zvertex_h.view()[i].sortInd() << "\t" - << (int)zvertex_h.view().nvFinal() << std::endl; + for (int i = 0; i < 10; ++i) { + std::cout << (int)zvertex_h.view()[i].idv() << '\t' << zvertex_h.view()[i].zv() << '\t' + << zvertex_h.view()[i].wv() << '\t' << zvertex_h.view()[i].chi2() << '\t' + << zvertex_h.view()[i].ptv2() << '\t' << (int)zvertex_h.view()[i].ndof() << '\t' + << (int)zvertex_h.view()[i].sortInd() << '\t' << (int)zvertex_h.view().nvFinal() << '\n'; + } } } - return 0; + return EXIT_SUCCESS; } diff --git a/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.dev.cc b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.dev.cc index 749073d1f916f..75a1ebf6b9269 100644 --- a/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.dev.cc +++ b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.dev.cc @@ -1,62 +1,59 @@ -#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h" +#include + #include "DataFormats/VertexSoA/interface/ZVertexDevice.h" #include "DataFormats/VertexSoA/interface/ZVertexHost.h" -#include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" // Check if this is really needed; code doesn't compile without it - -namespace ALPAKA_ACCELERATOR_NAMESPACE { - using namespace alpaka; - using namespace cms::alpakatools; - - namespace testZVertexSoAT { - - class TestFillKernel { - public: - template >> - ALPAKA_FN_ACC void operator()(TAcc const& acc, reco::ZVertexSoAView zvertex_view) const { - if (cms::alpakatools::once_per_grid(acc)) { - zvertex_view.nvFinal() = 420; - } - - for (int32_t j : elements_with_stride(acc, zvertex_view.metadata().size())) { - zvertex_view[j].idv() = (int16_t)j; - zvertex_view[j].zv() = (float)j; - zvertex_view[j].wv() = (float)j; - zvertex_view[j].chi2() = (float)j; - zvertex_view[j].ptv2() = (float)j; - zvertex_view[j].ndof() = (int32_t)j; - zvertex_view[j].sortInd() = (uint16_t)j; - } +#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h" +#include "HeterogeneousCore/AlpakaInterface/interface/config.h" +#include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" + +namespace ALPAKA_ACCELERATOR_NAMESPACE::testZVertexSoAT { + + class TestFillKernel { + public: + template >> + ALPAKA_FN_ACC void operator()(TAcc const& acc, reco::ZVertexSoAView zvertex_view) const { + if (cms::alpakatools::once_per_grid(acc)) { + zvertex_view.nvFinal() = 420; } - }; - - class TestVerifyKernel { - public: - template >> - ALPAKA_FN_ACC void operator()(TAcc const& acc, reco::ZVertexSoAView zvertex_view) const { - if (cms::alpakatools::once_per_grid(acc)) { - ALPAKA_ASSERT_ACC(zvertex_view.nvFinal() == 420); - } - - for (int32_t j : elements_with_stride(acc, zvertex_view.nvFinal())) { - assert(zvertex_view[j].idv() == j); - assert(zvertex_view[j].zv() - (float)j < 0.0001); - assert(zvertex_view[j].wv() - (float)j < 0.0001); - assert(zvertex_view[j].chi2() - (float)j < 0.0001); - assert(zvertex_view[j].ptv2() - (float)j < 0.0001); - assert(zvertex_view[j].ndof() == j); - assert(zvertex_view[j].sortInd() == uint32_t(j)); - } + + for (int32_t j : cms::alpakatools::uniform_elements(acc, zvertex_view.metadata().size())) { + zvertex_view[j].idv() = (int16_t)j; + zvertex_view[j].zv() = (float)j; + zvertex_view[j].wv() = (float)j; + zvertex_view[j].chi2() = (float)j; + zvertex_view[j].ptv2() = (float)j; + zvertex_view[j].ndof() = (int32_t)j; + zvertex_view[j].sortInd() = (uint16_t)j; + } + } + }; + + class TestVerifyKernel { + public: + template >> + ALPAKA_FN_ACC void operator()(TAcc const& acc, reco::ZVertexSoAView zvertex_view) const { + if (cms::alpakatools::once_per_grid(acc)) { + ALPAKA_ASSERT_ACC(zvertex_view.nvFinal() == 420); + } + + for (int32_t j : cms::alpakatools::uniform_elements(acc, zvertex_view.nvFinal())) { + assert(zvertex_view[j].idv() == j); + assert(zvertex_view[j].zv() - (float)j < 0.0001); + assert(zvertex_view[j].wv() - (float)j < 0.0001); + assert(zvertex_view[j].chi2() - (float)j < 0.0001); + assert(zvertex_view[j].ptv2() - (float)j < 0.0001); + assert(zvertex_view[j].ndof() == j); + assert(zvertex_view[j].sortInd() == uint32_t(j)); } - }; - - void runKernels(reco::ZVertexSoAView zvertex_view, Queue& queue) { - uint32_t items = 64; - uint32_t groups = divide_up_by(zvertex_view.metadata().size(), items); - auto workDiv = make_workdiv(groups, items); - alpaka::exec(queue, workDiv, TestFillKernel{}, zvertex_view); - alpaka::exec(queue, workDiv, TestVerifyKernel{}, zvertex_view); } + }; - } // namespace testZVertexSoAT + void runKernels(reco::ZVertexSoAView zvertex_view, Queue& queue) { + uint32_t items = 64; + uint32_t groups = cms::alpakatools::divide_up_by(zvertex_view.metadata().size(), items); + auto workDiv = cms::alpakatools::make_workdiv(groups, items); + alpaka::exec(queue, workDiv, TestFillKernel{}, zvertex_view); + alpaka::exec(queue, workDiv, TestVerifyKernel{}, zvertex_view); + } -} // namespace ALPAKA_ACCELERATOR_NAMESPACE +} // namespace ALPAKA_ACCELERATOR_NAMESPACE::testZVertexSoAT diff --git a/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.h b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.h new file mode 100644 index 0000000000000..bad69a4d92bb5 --- /dev/null +++ b/DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.h @@ -0,0 +1,13 @@ +#ifndef DataFormats_VertexSoA_test_alpaka_ZVertexSoA_test_h +#define DataFormats_VertexSoA_test_alpaka_ZVertexSoA_test_h + +#include "DataFormats/VertexSoA/interface/ZVertexSoA.h" +#include "HeterogeneousCore/AlpakaInterface/interface/config.h" + +namespace ALPAKA_ACCELERATOR_NAMESPACE::testZVertexSoAT { + + void runKernels(reco::ZVertexSoAView zvertex_view, Queue& queue); + +} // namespace ALPAKA_ACCELERATOR_NAMESPACE::testZVertexSoAT + +#endif // DataFormats_VertexSoA_test_alpaka_ZVertexSoA_test_h