#include #include #include #include "ittnotify.h" #include int main() { tbb::concurrent_unordered_map testmap; const int worksize = 10000000; __itt_domain* vt_domain = __itt_domain_create("sample"); const std::string event_name_build_table = "build_table"; __itt_event event_build_table = __itt_event_create( event_name_build_table.c_str(), event_name_build_table.size() ); const std::string event_name_traverse_table = "traverse_table"; __itt_event event_traverse_table = __itt_event_create( event_name_traverse_table.c_str(), event_name_traverse_table.size() ); // BUILD THE TABLE __itt_event_start(event_build_table); tbb::parallel_for(0, worksize, [&](unsigned int x) { testmap[ x ] = x; } ); __itt_event_end(event_build_table); // TRAVERSE THE TABLE __itt_event_start(event_traverse_table); tbb::concurrent_vector interesting_numbers; tbb::parallel_for( testmap.range(), [&]( decltype( testmap)::range_type& r) { for ( auto curr_entry = r.begin(); curr_entry != r.end(); ++curr_entry) { // We are going to do something a bit tricky / expensive auto my_num = curr_entry->second; auto counter = my_num; for ( int i = 2; i < 100; ++i ) { if ( i % 2 == 0 ) { counter = counter * i; } else { counter = 3 * counter - i; } } if ( counter < my_num ) { interesting_numbers.push_back(curr_entry->second); } } } ); __itt_event_end(event_traverse_table); // Now, just do something silly to prevent optimizer from messing with us std::cout << "Junk: " << interesting_numbers.size() << std::endl; }