Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-22 07:34:11

0001 #include <cassert>
0002 #include <cstdlib>
0003 #include <iostream>
0004 #include <new>
0005 
0006 #include <alpaka/alpaka.hpp>
0007 
0008 #include "FWCore/Utilities/interface/stringize.h"
0009 #include "HeterogeneousCore/AlpakaInterface/interface/SimpleVector.h"
0010 #include "HeterogeneousCore/AlpakaInterface/interface/devices.h"
0011 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0012 #include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
0013 #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h"
0014 
0015 using namespace cms::alpakatools;
0016 using namespace ALPAKA_ACCELERATOR_NAMESPACE;
0017 
0018 struct vector_pushback {
0019   ALPAKA_FN_ACC void operator()(Acc1D const& acc, SimpleVector<int>* foo) const {
0020     for (auto index : uniform_elements(acc))
0021       foo->push_back(acc, index);
0022   }
0023 };
0024 
0025 struct vector_reset {
0026   ALPAKA_FN_ACC void operator()(Acc1D const& acc, SimpleVector<int>* foo) const { foo->reset(); }
0027 };
0028 
0029 struct vector_emplace_back {
0030   ALPAKA_FN_ACC void operator()(Acc1D const& acc, SimpleVector<int>* foo) const {
0031     for (auto index : uniform_elements(acc))
0032       foo->emplace_back(acc, index);
0033   }
0034 };
0035 
0036 int main() {
0037   // get the list of devices on the current platform
0038   auto const& devices = cms::alpakatools::devices<Platform>();
0039   if (devices.empty()) {
0040     std::cerr << "No devices available for the " EDM_STRINGIZE(ALPAKA_ACCELERATOR_NAMESPACE) " backend, "
0041       "the test will be skipped.\n";
0042     exit(EXIT_FAILURE);
0043   }
0044 
0045   // run the test on each device
0046   for (auto const& device : devices) {
0047     Queue queue(device);
0048     auto maxN = 10000;
0049     auto vec_h = make_host_buffer<cms::alpakatools::SimpleVector<int>>(queue);
0050     auto vec_d = make_device_buffer<cms::alpakatools::SimpleVector<int>>(queue);
0051     auto data_h = make_host_buffer<int[]>(queue, maxN);
0052     auto data_d = make_device_buffer<int[]>(queue, maxN);
0053 
0054     [[maybe_unused]] auto v = make_SimpleVector(maxN, data_d.data());
0055 
0056     // Prepare the vec object on the host
0057     auto tmp_vec_h = make_host_buffer<cms::alpakatools::SimpleVector<int>>(queue);
0058     make_SimpleVector(tmp_vec_h.data(), maxN, data_d.data());
0059     assert(tmp_vec_h->size() == 0);
0060     assert(tmp_vec_h->capacity() == static_cast<int>(maxN));
0061 
0062     // ... and copy the object to the device.
0063     alpaka::memcpy(queue, vec_d, tmp_vec_h);
0064     alpaka::wait(queue);
0065 
0066     int numBlocks = 5;
0067     int numThreadsPerBlock = 256;
0068     const auto workDiv = make_workdiv<Acc1D>(numBlocks, numThreadsPerBlock);
0069     alpaka::enqueue(queue, alpaka::createTaskKernel<Acc1D>(workDiv, vector_pushback(), vec_d.data()));
0070     alpaka::wait(queue);
0071 
0072     alpaka::memcpy(queue, vec_h, vec_d);
0073     alpaka::wait(queue);
0074     printf("vec_h->size()=%d, numBlocks * numThreadsPerBlock=%d, maxN=%d\n",
0075            vec_h->size(),
0076            numBlocks * numThreadsPerBlock,
0077            maxN);
0078     assert(vec_h->size() == (numBlocks * numThreadsPerBlock < maxN ? numBlocks * numThreadsPerBlock : maxN));
0079     alpaka::enqueue(queue, alpaka::createTaskKernel<Acc1D>(workDiv, vector_reset(), vec_d.data()));
0080     alpaka::wait(queue);
0081 
0082     alpaka::memcpy(queue, vec_h, vec_d);
0083     alpaka::wait(queue);
0084 
0085     assert(vec_h->size() == 0);
0086 
0087     alpaka::enqueue(queue, alpaka::createTaskKernel<Acc1D>(workDiv, vector_emplace_back(), vec_d.data()));
0088     alpaka::wait(queue);
0089 
0090     alpaka::memcpy(queue, vec_h, vec_d);
0091     alpaka::wait(queue);
0092 
0093     assert(vec_h->size() == (numBlocks * numThreadsPerBlock < maxN ? numBlocks * numThreadsPerBlock : maxN));
0094 
0095     alpaka::memcpy(queue, data_h, data_d);
0096   }
0097   std::cout << "TEST PASSED" << std::endl;
0098   return 0;
0099 }