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
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
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
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
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 }