Skip to content

Commit

Permalink
Prepared for copy tests
Browse files Browse the repository at this point in the history
  • Loading branch information
erikzenker committed Feb 1, 2016
1 parent 936ce59 commit ff15ad9
Showing 1 changed file with 225 additions and 2 deletions.
227 changes: 225 additions & 2 deletions test/unit/mem/view/src/ViewSubViewTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
*/

#include <alpaka/alpaka.hpp>
#include <alpaka/test/acc/Acc.hpp> // alpaka::test::acc::TestAccs
#include <alpaka/test/acc/Acc.hpp> // alpaka::test::acc::TestAccs
#include <alpaka/test/stream/Stream.hpp> // DefaultStream
#include <alpaka/test/mem/view/Iterator.hpp> // Iterator

#include <boost/test/unit_test.hpp>

Expand Down Expand Up @@ -158,6 +160,46 @@ static auto createVecFromIndexedFn()
TSize());
}

//-----------------------------------------------------------------------------
//! Prints all elements of the buffer.
//-----------------------------------------------------------------------------
struct PrintBufferKernel {
template <typename TAcc,
typename TIter>
ALPAKA_FN_ACC void operator()(
TAcc const & acc,
TIter begin,
TIter end) const {

(void)acc;
for(; begin != end; begin++){
std::cout << *begin << std::endl;
}
}
};

//-----------------------------------------------------------------------------
//! Compares iterator element-wise
//-----------------------------------------------------------------------------
struct CompareBufferKernel {
template <typename TAcc,
typename TIterA,
typename TIterB>
ALPAKA_FN_ACC void operator()(
TAcc const & acc,
TIterA beginA,
TIterA endA,
TIterB beginB) const {

(void)acc;
for(; beginA != endA; beginA++, beginB++){
BOOST_REQUIRE_EQUAL(
*beginA,
*beginB);
}
}
};

//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
Expand All @@ -170,7 +212,6 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(
using Elem = float;
using Dim = alpaka::dim::Dim<TAcc>;
using Size = alpaka::size::Size<TAcc>;

using View = alpaka::mem::view::ViewSubView<Dev, Elem, Dim, Size>;

Dev dev(alpaka::dev::DevMan<TAcc>::getDevByIdx(0u));
Expand Down Expand Up @@ -266,4 +307,186 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(
"The size type of the view has to be equal to the specified one.");
}

BOOST_AUTO_TEST_CASE_TEMPLATE(
copyViewSubViewStatic,
TAcc,
alpaka::test::acc::TestAccs)
{
using DevAcc = alpaka::dev::Dev<TAcc>;
using Elem = float;
using Dim = alpaka::dim::Dim<TAcc>;
using Size = alpaka::size::Size<TAcc>;
using WorkDiv = alpaka::workdiv::WorkDivMembers<Dim, Size>;
using Host = alpaka::acc::AccCpuSerial<Dim, Size>;
using DevHost = alpaka::dev::Dev<Host>;
using Stream = alpaka::test::stream::DefaultStream<DevAcc>;

using View = alpaka::mem::view::ViewSubView<DevAcc, Elem, Dim, Size>;
using ViewPlainPtr = alpaka::mem::view::ViewPlainPtr<DevHost, Elem, Dim, Size>;

const Size nElementsPerDim = 4;
const Size nElementsPerDimView = 2;
const Size offsetInAllDims = 1;

DevHost devHost (alpaka::dev::DevMan<Host>::getDevByIdx(0));
DevAcc devAcc(alpaka::dev::DevMan<TAcc>::getDevByIdx(0u));
Stream stream (devAcc);

alpaka::Vec<Dim, Size> elementsPerThread(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));
alpaka::Vec<Dim, Size> threadsPerBlock(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));
alpaka::Vec<Dim, Size> const blocksPerGrid(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));

WorkDiv const workdiv(alpaka::workdiv::WorkDivMembers<Dim, Size>(
blocksPerGrid,
threadsPerBlock,
elementsPerThread));


auto const extentBuf(alpaka::Vec<Dim, Size>::all(nElementsPerDim));
auto const extentView(alpaka::Vec<Dim, Size>::all(nElementsPerDimView));
auto const offsetView(alpaka::Vec<Dim, Size>::all(offsetInAllDims));
auto buf(alpaka::mem::buf::alloc<Elem, Size>(devAcc, extentBuf));
auto buf2(alpaka::mem::buf::alloc<Elem, Size>(devAcc, extentView));
View view(buf, extentView, offsetView);

// Init buf with increasing values
std::vector<Elem> v(extentBuf.prod(), static_cast<Elem>(0));
std::iota(v.begin(), v.end(), static_cast<Elem>(0));
ViewPlainPtr plainBuf(v.data(), devHost, extentBuf);
alpaka::mem::view::copy(stream, buf, plainBuf, extentBuf);

CompareBufferKernel compareBufferKernel;
PrintBufferKernel printBufferKernel;

switch(Dim::value){
case 1:
{
std::vector<Elem> v2{1,2};
ViewPlainPtr plainBuf2(v2.data(), devHost, extentView);
alpaka::mem::view::copy(stream, buf2, plainBuf2, extentView);
auto const compare (alpaka::exec::create<TAcc> (
workdiv,
compareBufferKernel,
alpaka::test::mem::view::begin(buf2),
alpaka::test::mem::view::end(buf2),
alpaka::test::mem::view::begin(view)));
alpaka::stream::enqueue(stream, compare);
alpaka::wait::wait(stream);
break;
}
case 2:
{
std::vector<Elem> v2{5, 6, 9, 10};
ViewPlainPtr plainBuf2(v2.data(), devHost, extentView);
alpaka::mem::view::copy(stream, buf2, plainBuf2, extentView);
auto const compare (alpaka::exec::create<TAcc> (
workdiv,
compareBufferKernel,
alpaka::test::mem::view::begin(buf2),
alpaka::test::mem::view::end(buf2),
alpaka::test::mem::view::begin(view)));
alpaka::stream::enqueue(stream, compare);
alpaka::wait::wait(stream);
break;
}
case 3:
{
std::vector<Elem> v2{21, 22, 25, 26, 37, 38, 41, 42};
ViewPlainPtr plainBuf2(v2.data(), devHost, extentView);
alpaka::mem::view::copy(stream, buf2, plainBuf2, extentView);
auto const compare (alpaka::exec::create<TAcc> (
workdiv,
compareBufferKernel,
alpaka::test::mem::view::begin(buf2),
alpaka::test::mem::view::end(buf2),
alpaka::test::mem::view::begin(view)));
alpaka::stream::enqueue(stream, compare);
alpaka::wait::wait(stream);
break;
}
case 4:
{
/*
std::vector<Elem> v2{75, 76, 78, 79, 91, 92, 95, 96, 139, 140, 143, 144, 155, 156, 159, 160};
ViewPlainPtr plainBuf2(v2.data(), devHost, extentView);
alpaka::mem::view::copy(stream, buf2, plainBuf2, extentView);
auto const compare (alpaka::exec::create<TAcc> (
workdiv,
compareBufferKernel,
alpaka::test::mem::view::begin(buf2),
alpaka::test::mem::view::end(buf2),
alpaka::test::mem::view::begin(view)));
*/
alpaka::wait::wait(stream);
break;
}
default:
alpaka::wait::wait(stream);
break;
};
}

BOOST_AUTO_TEST_CASE_TEMPLATE(
copyViewSubViewGeneric,
TAcc,
alpaka::test::acc::TestAccs)
{
using DevAcc = alpaka::dev::Dev<TAcc>;
using Elem = float;
using Dim = alpaka::dim::Dim<TAcc>;
using Size = alpaka::size::Size<TAcc>;
using WorkDiv = alpaka::workdiv::WorkDivMembers<Dim, Size>;
using Host = alpaka::acc::AccCpuSerial<Dim, Size>;
using DevHost = alpaka::dev::Dev<Host>;
using Stream = alpaka::test::stream::DefaultStream<DevAcc>;

using View = alpaka::mem::view::ViewSubView<DevAcc, Elem, Dim, Size>;
using ViewPlainPtr = alpaka::mem::view::ViewPlainPtr<DevHost, Elem, Dim, Size>;

if(Dim::value != 4){
DevHost devHost (alpaka::dev::DevMan<Host>::getDevByIdx(0));
DevAcc devAcc(alpaka::dev::DevMan<TAcc>::getDevByIdx(0u));
Stream stream (devAcc);

auto const extentBuf(createVecFromIndexedFn<Dim, Size, CreateExtentBufVal>());
auto const extentView(createVecFromIndexedFn<Dim, Size, CreateExtentViewVal>());
auto const offsetView(alpaka::Vec<Dim, Size>::all(sizeof(Size)));
auto buf(alpaka::mem::buf::alloc<Elem, Size>(devAcc, extentBuf));
auto buf2(alpaka::mem::buf::alloc<Elem, Size>(devAcc, extentView));
View view(buf, extentView, offsetView);

//-----------------------------------------------------------------------------
// alpaka::mem::view::copy
// Init buf with increasing values
std::vector<Elem> v(extentBuf.prod(), static_cast<Elem>(0));
std::iota(v.begin(), v.end(), static_cast<Elem>(0));
ViewPlainPtr plainBuf(v.data(), devHost, extentBuf);
alpaka::mem::view::copy(stream, buf, plainBuf, extentBuf);

// Copy view into 2nd buf
alpaka::mem::view::copy(stream, buf2, view, extentView);

// Check values in 2nd buf
alpaka::Vec<Dim, Size> elementsPerThread(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));
alpaka::Vec<Dim, Size> threadsPerBlock(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));
alpaka::Vec<Dim, Size> const blocksPerGrid(alpaka::Vec<Dim, Size>::all(static_cast<Size>(1)));

WorkDiv const workdiv(alpaka::workdiv::WorkDivMembers<Dim, Size>(
blocksPerGrid,
threadsPerBlock,
elementsPerThread));

CompareBufferKernel compareBufferKernel;
auto const compare (alpaka::exec::create<TAcc> (
workdiv,
compareBufferKernel,
alpaka::test::mem::view::begin(buf2),
alpaka::test::mem::view::end(buf2),
alpaka::test::mem::view::begin(view)));

alpaka::stream::enqueue(stream, compare);
alpaka::wait::wait(stream);
}
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit ff15ad9

Please sign in to comment.