Skip to content

Commit

Permalink
Reorganize kernel region test files and add test for synchronization.
Browse files Browse the repository at this point in the history
  • Loading branch information
rhornung67 committed May 6, 2020
1 parent 72a642a commit 19972b7
Show file tree
Hide file tree
Showing 8 changed files with 256 additions and 43 deletions.
3 changes: 3 additions & 0 deletions test/functional/kernel/region/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@ if(RAJA_ENABLE_OPENMP)
raja_add_test(
NAME test-kernel-region-openmp
SOURCES test-kernel-region-openmp.cpp)
raja_add_test(
NAME test-kernel-region-sync-openmp
SOURCES test-kernel-region-sync-openmp.cpp)
endif()
14 changes: 7 additions & 7 deletions test/functional/kernel/region/test-kernel-region-openmp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

#include "../../forall/test-forall-utils.hpp"

using SequentialKernelRegionExecPols =
using OpenMPKernelRegionExecPols =
camp::list<

RAJA::KernelPolicy<
Expand Down Expand Up @@ -43,12 +43,12 @@ using SequentialKernelRegionExecPols =
>;


// Cartesian product of types for Sequential tests
using SequentialKernelRegionTypes =
// Cartesian product of types for OpenMP tests
using OpenMPKernelRegionTypes =
Test< camp::cartesian_product<IdxTypeList,
HostResourceList,
SequentialKernelRegionExecPols> >::Types;
OpenMPKernelRegionExecPols> >::Types;

INSTANTIATE_TYPED_TEST_SUITE_P(Sequential,
KernelRegionTest,
SequentialKernelRegionTypes);
INSTANTIATE_TYPED_TEST_SUITE_P(OpenMP,
KernelRegionFunctionalTest,
OpenMPKernelRegionTypes);
2 changes: 1 addition & 1 deletion test/functional/kernel/region/test-kernel-region-seq.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ using SequentialKernelRegionTypes =
SequentialKernelRegionExecPols> >::Types;

INSTANTIATE_TYPED_TEST_SUITE_P(Sequential,
KernelRegionTest,
KernelRegionFunctionalTest,
SequentialKernelRegionTypes);
70 changes: 70 additions & 0 deletions test/functional/kernel/region/test-kernel-region-sync-openmp.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC
// and RAJA project contributors. See the RAJA/COPYRIGHT file for details.
//
// SPDX-License-Identifier: (BSD-3-Clause)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

#include "tests/test-kernel-region-sync.hpp"

#include "../../forall/test-forall-utils.hpp"

using OpenMPKernelRegionSyncExecPols =
camp::list<

RAJA::KernelPolicy<
RAJA::statement::Region<RAJA::omp_parallel_region,

RAJA::statement::For<0, RAJA::omp_for_nowait_exec,
RAJA::statement::Lambda<0, RAJA::Segs<0>>
>,

RAJA::statement::OmpSyncThreads,

RAJA::statement::For<1, RAJA::omp_for_nowait_exec,
RAJA::statement::Lambda<1, RAJA::Segs<1>>
>,

RAJA::statement::OmpSyncThreads,

RAJA::statement::For<0, RAJA::omp_for_nowait_exec,
RAJA::statement::Lambda<2, RAJA::Segs<0>>
>

>
>,

RAJA::KernelPolicy<
RAJA::statement::Region<RAJA::omp_parallel_region,

RAJA::statement::For<0, RAJA::omp_for_exec,
RAJA::statement::Lambda<0, RAJA::Segs<0>>
>,

RAJA::statement::OmpSyncThreads,

RAJA::statement::For<1, RAJA::omp_for_exec,
RAJA::statement::Lambda<1, RAJA::Segs<1>>
>,

RAJA::statement::OmpSyncThreads,

RAJA::statement::For<0, RAJA::omp_for_exec,
RAJA::statement::Lambda<2, RAJA::Segs<0>>
>

>
>

>;


// Cartesian product of types for OpenMP tests
using OpenMPKernelRegionSyncTypes =
Test< camp::cartesian_product<IdxTypeList,
HostResourceList,
OpenMPKernelRegionSyncExecPols> >::Types;

INSTANTIATE_TYPED_TEST_SUITE_P(OpenMP,
KernelRegionFunctionalTest,
OpenMPKernelRegionSyncTypes);
96 changes: 96 additions & 0 deletions test/functional/kernel/region/tests/test-kernel-region-sync.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC
// and RAJA project contributors. See the RAJA/COPYRIGHT file for details.
//
// SPDX-License-Identifier: (BSD-3-Clause)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

#ifndef __TEST_KERNEL_REGION_SYNC_HPP__
#define __TEST_KERNEL_REGION_SYNC_HPP__

#include "test-kernel-region-utils.hpp"

#include <algorithm>
#include <numeric>
#include <vector>

template <typename INDEX_TYPE, typename WORKING_RES, typename EXEC_POLICY>
void KernelRegionSyncFunctionalTest(INDEX_TYPE first, INDEX_TYPE last)
{
camp::resources::Resource host_res{camp::resources::Host()};
camp::resources::Resource work_res{WORKING_RES()};

const INDEX_TYPE N = last - first;

INDEX_TYPE* work_array1;
INDEX_TYPE* work_array2;
INDEX_TYPE* work_array3;

INDEX_TYPE* check_array;

allocRegionTestData(N,
work_res,
&work_array1, &work_array2, &work_array3,
host_res,
&check_array);

work_res.memset( work_array1, 0, sizeof(INDEX_TYPE) * N );
work_res.memset( work_array2, 0, sizeof(INDEX_TYPE) * N );
work_res.memset( work_array3, 0, sizeof(INDEX_TYPE) * N );

host_res.memset( check_array, 0, sizeof(INDEX_TYPE) * N );

std::vector<INDEX_TYPE> idx_array(N);
std::iota(idx_array.begin(), idx_array.end(), first);
std::reverse(idx_array.begin(), idx_array.end());
RAJA::TypedListSegment<INDEX_TYPE> lseg(&idx_array[0], N,
work_res);

RAJA::TypedRangeSegment<INDEX_TYPE> rseg(first, last);

RAJA::kernel<EXEC_POLICY>(

RAJA::make_tuple(rseg, lseg),

[=] (INDEX_TYPE i) {
work_array1[i - first] = 50;
},

[=] (INDEX_TYPE i) {
work_array2[i - first] = 100;
},

[=] (INDEX_TYPE i) {
work_array3[i - first] = work_array1[i - first] +
work_array2[i - first] + 1;
}

);

work_res.memcpy(check_array, work_array3, sizeof(INDEX_TYPE) * N);

for (INDEX_TYPE i = 0; i < N; i++) {
ASSERT_EQ(check_array[i], 151);
}

deallocRegionTestData(work_res,
work_array1, work_array2, work_array3,
host_res,
check_array);
}

TYPED_TEST_P(KernelRegionFunctionalTest, RegionSyncKernel)
{
using INDEX_TYPE = typename camp::at<TypeParam, camp::num<0>>::type;
using WORKING_RES = typename camp::at<TypeParam, camp::num<1>>::type;
using EXEC_POLICY = typename camp::at<TypeParam, camp::num<2>>::type;

KernelRegionSyncFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(0, 25);
KernelRegionSyncFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(1, 153);
KernelRegionSyncFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(3, 2556);
}

REGISTER_TYPED_TEST_SUITE_P(KernelRegionFunctionalTest,
RegionSyncKernel);

#endif // __TEST_KERNEL_REGION_SYNC_HPP__
51 changes: 51 additions & 0 deletions test/functional/kernel/region/tests/test-kernel-region-utils.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC
// and RAJA project contributors. See the RAJA/COPYRIGHT file for details.
//
// SPDX-License-Identifier: (BSD-3-Clause)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

#ifndef __TEST_KERNEL_REGION_UTILS_HPP__
#define __TEST_KERNEL_REGION_UTILS_HPP__

#include "RAJA/RAJA.hpp"

#include "camp/resource.hpp"

#include "gtest/gtest.h"

template <typename T>
class KernelRegionFunctionalTest : public ::testing::Test
{
};

template <typename T>
void allocRegionTestData(int N,
camp::resources::Resource& work_res,
T** work1, T** work2, T** work3,
camp::resources::Resource& host_res,
T** check)
{
*work1 = work_res.allocate<T>(N);
*work2 = work_res.allocate<T>(N);
*work3 = work_res.allocate<T>(N);

*check = host_res.allocate<T>(N);
}

template <typename T>
void deallocRegionTestData(camp::resources::Resource& work_res,
T* work1, T* work2, T* work3,
camp::resources::Resource& host_res,
T* check)
{
work_res.deallocate(work1);
work_res.deallocate(work2);
work_res.deallocate(work3);

host_res.deallocate(check);
}

TYPED_TEST_SUITE_P(KernelRegionFunctionalTest);

#endif // __TEST_KERNEL_REGION_UTILS_HPP__
57 changes: 25 additions & 32 deletions test/functional/kernel/region/tests/test-kernel-region.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,37 @@
#ifndef __TEST_KERNEL_REGION_HPP__
#define __TEST_KERNEL_REGION_HPP__

#include "RAJA/RAJA.hpp"
#include "test-kernel-region-utils.hpp"

#include "camp/resource.hpp"

#include "gtest/gtest.h"

TYPED_TEST_SUITE_P(KernelRegionTest);
template <typename T>
class KernelRegionTest : public ::testing::Test
{
};

template <typename INDEX_TYPE, typename WORKING_RES, typename EXEC_POLICY>
void KernelBasicRegionTest(INDEX_TYPE first, INDEX_TYPE last)
void KernelRegionBasicFunctionalTest(INDEX_TYPE first, INDEX_TYPE last)
{
camp::resources::Resource host_res{camp::resources::Host()};
camp::resources::Resource work_res{WORKING_RES()};

//
// Set some local variables and create some segments for using in tests
//
const INDEX_TYPE N = last - first;

RAJA::TypedRangeSegment<INDEX_TYPE> rseg(first, last);
INDEX_TYPE* work_array1;
INDEX_TYPE* work_array2;
INDEX_TYPE* work_array3;

INDEX_TYPE* check_array;

INDEX_TYPE* work_array1 = work_res.allocate<INDEX_TYPE>(N);
INDEX_TYPE* work_array2 = work_res.allocate<INDEX_TYPE>(N);
INDEX_TYPE* work_array3 = work_res.allocate<INDEX_TYPE>(N);
allocRegionTestData(N,
work_res,
&work_array1, &work_array2, &work_array3,
host_res,
&check_array);

work_res.memset( work_array1, 0, sizeof(INDEX_TYPE) * N );
work_res.memset( work_array2, 0, sizeof(INDEX_TYPE) * N );
work_res.memset( work_array3, 0, sizeof(INDEX_TYPE) * N );

camp::resources::Resource host_res{camp::resources::Host()};
host_res.memset( check_array, 0, sizeof(INDEX_TYPE) * N );

INDEX_TYPE* check_array = host_res.allocate<INDEX_TYPE>(N);

host_res.memset( check_array, 0, sizeof(INDEX_TYPE) * N );
RAJA::TypedRangeSegment<INDEX_TYPE> rseg(first, last);

RAJA::kernel<EXEC_POLICY>(

Expand All @@ -71,25 +65,24 @@ void KernelBasicRegionTest(INDEX_TYPE first, INDEX_TYPE last)
ASSERT_EQ(check_array[i], 151);
}

work_res.deallocate(work_array1);
work_res.deallocate(work_array2);
work_res.deallocate(work_array3);

host_res.deallocate(check_array);
deallocRegionTestData(work_res,
work_array1, work_array2, work_array3,
host_res,
check_array);
}

TYPED_TEST_P(KernelRegionTest, RegionSegmentKernel)
TYPED_TEST_P(KernelRegionFunctionalTest, RegionBasicKernel)
{
using INDEX_TYPE = typename camp::at<TypeParam, camp::num<0>>::type;
using WORKING_RES = typename camp::at<TypeParam, camp::num<1>>::type;
using EXEC_POLICY = typename camp::at<TypeParam, camp::num<2>>::type;

KernelBasicRegionTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(0, 25);
KernelBasicRegionTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(1, 153);
KernelBasicRegionTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(3, 2556);
KernelRegionBasicFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(0, 25);
KernelRegionBasicFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(1, 153);
KernelRegionBasicFunctionalTest<INDEX_TYPE, WORKING_RES, EXEC_POLICY>(3, 2556);
}

REGISTER_TYPED_TEST_SUITE_P(KernelRegionTest,
RegionSegmentKernel);
REGISTER_TYPED_TEST_SUITE_P(KernelRegionFunctionalTest,
RegionBasicKernel);

#endif // __TEST_KERNEL_REGION_HPP__
6 changes: 3 additions & 3 deletions test/functional/scan/tests/test-scan-utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// SPDX-License-Identifier: (BSD-3-Clause)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

#ifndef __TEST_SCAN_HPP__
#define __TEST_SCAN_HPP__
#ifndef __TEST_SCAN_UTILS_HPP__
#define __TEST_SCAN_UTILS_HPP__

#include "RAJA/RAJA.hpp"
#include "gtest/gtest.h"
Expand Down Expand Up @@ -68,4 +68,4 @@ void deallocScanTestData(camp::resources::Resource& work_res,

TYPED_TEST_SUITE_P(ScanFunctionalTest);

#endif //__TEST_SCAN_HPP__
#endif //__TEST_SCAN_UTILS_HPP__

0 comments on commit 19972b7

Please sign in to comment.