Update Kokkos library in LAMMPS to v3.0
This commit is contained in:
@ -1,10 +1,11 @@
|
||||
//@HEADER
|
||||
// ************************************************************************
|
||||
//
|
||||
// Kokkos v. 2.0
|
||||
// Copyright (2014) Sandia Corporation
|
||||
// Kokkos v. 3.0
|
||||
// Copyright (2020) National Technology & Engineering
|
||||
// Solutions of Sandia, LLC (NTESS).
|
||||
//
|
||||
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
@ -22,10 +23,10 @@
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
|
||||
// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY
|
||||
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
|
||||
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
@ -50,12 +51,10 @@
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
|
||||
namespace Perf {
|
||||
|
||||
template <typename Device, bool Near>
|
||||
struct UnorderedMapTest
|
||||
{
|
||||
struct UnorderedMapTest {
|
||||
typedef Device execution_space;
|
||||
typedef Kokkos::UnorderedMap<uint32_t, uint32_t, execution_space> map_type;
|
||||
typedef typename map_type::histogram_type histogram_type;
|
||||
@ -68,22 +67,22 @@ struct UnorderedMapTest
|
||||
uint32_t capacity;
|
||||
uint32_t inserts;
|
||||
uint32_t collisions;
|
||||
double seconds;
|
||||
double seconds;
|
||||
map_type map;
|
||||
histogram_type histogram;
|
||||
|
||||
UnorderedMapTest( uint32_t arg_capacity, uint32_t arg_inserts, uint32_t arg_collisions)
|
||||
: capacity(arg_capacity)
|
||||
, inserts(arg_inserts)
|
||||
, collisions(arg_collisions)
|
||||
, seconds(0)
|
||||
, map(capacity)
|
||||
, histogram(map.get_histogram())
|
||||
{
|
||||
Kokkos::Timer wall_clock ;
|
||||
UnorderedMapTest(uint32_t arg_capacity, uint32_t arg_inserts,
|
||||
uint32_t arg_collisions)
|
||||
: capacity(arg_capacity),
|
||||
inserts(arg_inserts),
|
||||
collisions(arg_collisions),
|
||||
seconds(0),
|
||||
map(capacity),
|
||||
histogram(map.get_histogram()) {
|
||||
Kokkos::Timer wall_clock;
|
||||
wall_clock.reset();
|
||||
|
||||
value_type v = {};
|
||||
value_type v = {};
|
||||
int loop_count = 0;
|
||||
do {
|
||||
++loop_count;
|
||||
@ -92,81 +91,79 @@ struct UnorderedMapTest
|
||||
Kokkos::parallel_reduce(inserts, *this, v);
|
||||
|
||||
if (v.failed_count > 0u) {
|
||||
const uint32_t new_capacity = map.capacity() + ((map.capacity()*3ull)/20u) + v.failed_count/collisions ;
|
||||
map.rehash( new_capacity );
|
||||
const uint32_t new_capacity = map.capacity() +
|
||||
((map.capacity() * 3ull) / 20u) +
|
||||
v.failed_count / collisions;
|
||||
map.rehash(new_capacity);
|
||||
}
|
||||
} while (v.failed_count > 0u);
|
||||
|
||||
seconds = wall_clock.seconds();
|
||||
|
||||
switch (loop_count)
|
||||
{
|
||||
case 1u: std::cout << " \033[0;32m" << loop_count << "\033[0m "; break;
|
||||
case 2u: std::cout << " \033[1;31m" << loop_count << "\033[0m "; break;
|
||||
default: std::cout << " \033[0;31m" << loop_count << "\033[0m "; break;
|
||||
switch (loop_count) {
|
||||
case 1u: std::cout << " \033[0;32m" << loop_count << "\033[0m "; break;
|
||||
case 2u: std::cout << " \033[1;31m" << loop_count << "\033[0m "; break;
|
||||
default: std::cout << " \033[0;31m" << loop_count << "\033[0m "; break;
|
||||
}
|
||||
std::cout << std::setprecision(2) << std::fixed << std::setw(5) << (1e9*(seconds/(inserts))) << "; " << std::flush;
|
||||
std::cout << std::setprecision(2) << std::fixed << std::setw(5)
|
||||
<< (1e9 * (seconds / (inserts))) << "; " << std::flush;
|
||||
|
||||
histogram.calculate();
|
||||
Device().fence();
|
||||
}
|
||||
|
||||
void print(std::ostream & metrics_out, std::ostream & length_out, std::ostream & distance_out, std::ostream & block_distance_out)
|
||||
{
|
||||
void print(std::ostream& metrics_out, std::ostream& length_out,
|
||||
std::ostream& distance_out, std::ostream& block_distance_out) {
|
||||
metrics_out << map.capacity() << " , ";
|
||||
metrics_out << inserts/collisions << " , ";
|
||||
metrics_out << (100.0 * inserts/collisions) / map.capacity() << " , ";
|
||||
metrics_out << inserts / collisions << " , ";
|
||||
metrics_out << (100.0 * inserts / collisions) / map.capacity() << " , ";
|
||||
metrics_out << inserts << " , ";
|
||||
metrics_out << (map.failed_insert() ? "true" : "false") << " , ";
|
||||
metrics_out << collisions << " , ";
|
||||
metrics_out << 1e9*(seconds/inserts) << " , ";
|
||||
metrics_out << 1e9 * (seconds / inserts) << " , ";
|
||||
metrics_out << seconds << std::endl;
|
||||
|
||||
length_out << map.capacity() << " , ";
|
||||
length_out << ((100.0 *inserts/collisions) / map.capacity()) << " , ";
|
||||
length_out << ((100.0 * inserts / collisions) / map.capacity()) << " , ";
|
||||
length_out << collisions << " , ";
|
||||
histogram.print_length(length_out);
|
||||
|
||||
distance_out << map.capacity() << " , ";
|
||||
distance_out << ((100.0 *inserts/collisions) / map.capacity()) << " , ";
|
||||
distance_out << ((100.0 * inserts / collisions) / map.capacity()) << " , ";
|
||||
distance_out << collisions << " , ";
|
||||
histogram.print_distance(distance_out);
|
||||
|
||||
block_distance_out << map.capacity() << " , ";
|
||||
block_distance_out << ((100.0 *inserts/collisions) / map.capacity()) << " , ";
|
||||
block_distance_out << ((100.0 * inserts / collisions) / map.capacity())
|
||||
<< " , ";
|
||||
block_distance_out << collisions << " , ";
|
||||
histogram.print_block_distance(block_distance_out);
|
||||
}
|
||||
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void init( value_type & v ) const
|
||||
{
|
||||
void init(value_type& v) const {
|
||||
v.failed_count = 0;
|
||||
v.max_list = 0;
|
||||
v.max_list = 0;
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void join( volatile value_type & dst, const volatile value_type & src ) const
|
||||
{
|
||||
void join(volatile value_type& dst, const volatile value_type& src) const {
|
||||
dst.failed_count += src.failed_count;
|
||||
dst.max_list = src.max_list < dst.max_list ? dst.max_list : src.max_list;
|
||||
}
|
||||
|
||||
KOKKOS_INLINE_FUNCTION
|
||||
void operator()(uint32_t i, value_type & v) const
|
||||
{
|
||||
const uint32_t key = Near ? i/collisions : i%(inserts/collisions);
|
||||
typename map_type::insert_result result = map.insert(key,i);
|
||||
void operator()(uint32_t i, value_type& v) const {
|
||||
const uint32_t key = Near ? i / collisions : i % (inserts / collisions);
|
||||
typename map_type::insert_result result = map.insert(key, i);
|
||||
v.failed_count += !result.failed() ? 0 : 1;
|
||||
v.max_list = result.list_position() < v.max_list ? v.max_list : result.list_position();
|
||||
v.max_list = result.list_position() < v.max_list ? v.max_list
|
||||
: result.list_position();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
template <typename Device, bool Near>
|
||||
void run_performance_tests(std::string const & base_file_name)
|
||||
{
|
||||
void run_performance_tests(std::string const& base_file_name) {
|
||||
#if 0
|
||||
std::string metrics_file_name = base_file_name + std::string("-metrics.csv");
|
||||
std::string length_file_name = base_file_name + std::string("-length.csv");
|
||||
@ -254,7 +251,6 @@ void run_performance_tests(std::string const & base_file_name)
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace Perf
|
||||
|
||||
} // namespace Perf
|
||||
|
||||
#endif //KOKKOS_TEST_UNORDERED_MAP_PERFORMANCE_HPP
|
||||
#endif // KOKKOS_TEST_UNORDERED_MAP_PERFORMANCE_HPP
|
||||
|
||||
Reference in New Issue
Block a user