Skip to content

Commit

Permalink
Let the test fail gracefully if no devies are found
Browse files Browse the repository at this point in the history
If more than one device is available, run the tests on all available
devices.

Replace elements_with_stide with uniform_elements.
  • Loading branch information
fwyzard committed Feb 21, 2024
1 parent 79973a2 commit 2d3d571
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 103 deletions.
95 changes: 47 additions & 48 deletions DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,70 +13,69 @@
the same Layout to access the data on host and print it.
*/

#include <alpaka/alpaka.hpp>
#include <cstdlib>
#include <unistd.h>
#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h"

#include <alpaka/alpaka.hpp>

#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<Platform>();
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<Platform>()[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;
}
107 changes: 52 additions & 55 deletions DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.dev.cc
Original file line number Diff line number Diff line change
@@ -1,62 +1,59 @@
#include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h"
#include <alpaka/alpaka.hpp>

#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 <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
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 <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
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 <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
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 <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
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<Acc1D>(groups, items);
alpaka::exec<Acc1D>(queue, workDiv, TestFillKernel{}, zvertex_view);
alpaka::exec<Acc1D>(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<Acc1D>(groups, items);
alpaka::exec<Acc1D>(queue, workDiv, TestFillKernel{}, zvertex_view);
alpaka::exec<Acc1D>(queue, workDiv, TestVerifyKernel{}, zvertex_view);
}

} // namespace ALPAKA_ACCELERATOR_NAMESPACE
} // namespace ALPAKA_ACCELERATOR_NAMESPACE::testZVertexSoAT
13 changes: 13 additions & 0 deletions DataFormats/VertexSoA/test/alpaka/ZVertexSoA_test.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 2d3d571

Please sign in to comment.