Difference between revisions of "DPS915 C U D A B O Y S"

From CDOT Wiki
Jump to: navigation, search
(Assignment 3)
 
(37 intermediate revisions by 2 users not shown)
Line 9: Line 9:
 
== Assignment 1 ==
 
== Assignment 1 ==
  
=== <span style="color: red">&#x2717;Profile 1: PI Approximation</span> ===
+
=== <span style="color: green">&#x2713; Profile 0: File Encryption</span> ===
 +
==== Description ====
 +
This piece of software takes a file and ecrypts it one of 4 ways:
 +
# Byte Inversion
 +
# Byte Cycle
 +
# Xor Cipher
 +
# RC4 Cipher
 +
 
 +
 
 +
Inside the byteCipher method, exists a for loop that could use optimization. Within this loop specifically, the lines that call the <code>cycle</code> and <code>rc4_output</code> functions are the ones that are taking the longest time to execute:
 +
      for (int i = 0; i < bufferSize; i++){
 +
                // going over every byte in the file
 +
                switch (mode) {
 +
                        case 0: // inversion
 +
                                buffer[i] = ~buffer[i];
 +
                                break;
 +
                        case 1: // cycle
 +
                                buffer [i] = cycle (buffer [i]);
 +
                                break;
 +
                        case 2: // RC4
 +
                                buffer [i] = buffer [i] ^ rc4_output();
 +
                                break;
 +
                }
 +
        }
 +
 
 +
Here is what these functions <code>cycle</code> and <code>rc4_output</code> functions look like:
 +
char cycle (char value) {
 +
        int leftMask = 170;
 +
        int rightMask = 85;
 +
        int iLeft = value & leftMask;
 +
        int iRight = value & rightMask;
 +
        iLeft = iLeft >> 1;
 +
        iRight = iRight << 1;
 +
        return iLeft | iRight;
 +
}
 +
 
 +
unsigned char rc4_output() {
 +
    unsigned char temp;
 +
    i = (i + 1) & 0xFF;
 +
    j = (j + S[i]) & 0xFF;
 +
    temp = S[i];
 +
    S[i] = S[j];
 +
    S[j] = temp;
 +
    return S[(S[i] + S[j]) & 0xFF];
 +
}
 +
 
 +
 
 +
We need to change these two functions so they are added to the CUDA device as "device functions".
 +
 
 +
==== Profiling on Linux ====
 +
 
 +
The following test runs were performed on the following Virtual Machine:
 +
* CentOS 7
 +
* i7-3820 @ 3.6 GHz
 +
* 2GB DDR3
 +
* gcc version 4.8.3
 +
 
 +
 
 +
Using compiler settings:
 +
g++ -c -O2 -g -pg -std=c++11 encFile.cpp
 +
 
 +
 
 +
 
 +
'''RC4 Cipher - 283 MB mp3 File'''
 +
[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/music.mp3
 +
/home/johny/aes/music.mp3
 +
* * * File Protector * * *
 +
Mode 4: RC4 cipher
 +
Please enter the RC4 key (8 chars min)
 +
testing123
 +
The password is: testing123
 +
Beginning encryption
 +
Completed: 100%
 +
Cipher completed.
 +
Program terminated.
 +
 
 +
real    0m6.758s
 +
user    0m3.551s
 +
sys    0m0.068s
 +
 
 +
Flat profile:
 +
Each sample counts as 0.01 seconds.
 +
  %  cumulative  self              self    total         
 +
time  seconds  seconds    calls  ms/call  ms/call  name   
 +
84.05      1.70    1.70 296271519    0.00    0.00  rc4_output()
 +
13.39      1.97    0.27                            byteCipher(int, std::string)
 +
  2.73      2.02    0.06        1    55.09    55.09  rc4_init(unsigned char*, unsigned int)
 +
  0.00      2.02    0.00        1    0.00    0.00  _GLOBAL__sub_I_S
 +
 
 +
As we can see the <code>rc4_output</code> and <code>byteCipher</code> functions take up most of the processing time.
 +
 
 +
 
 +
 
 +
'''RC4 Cipher - 636 MB iso File'''
 +
[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/cent.iso
 +
/home/johny/aes/cent.iso
 +
  * * * File Protector * * *
 +
Mode 4: RC4 cipher
 +
Please enter the RC4 key (8 chars min)
 +
testing123
 +
The password is: testing123
 +
Beginning encryption
 +
Completed: 100%
 +
Cipher completed.
 +
Program terminated.
 +
 
 +
real    0m10.293s
 +
user    0m8.235s
 +
sys    0m0.312s
 +
 
 +
Flat profile:
 +
Each sample counts as 0.01 seconds.
 +
  %  cumulative  self              self    total         
 +
time  seconds  seconds    calls  ms/call  ms/call  name   
 +
74.86      3.59    3.59 666894336    0.00    0.00  rc4_output()
 +
23.21      4.70    1.11                            byteCipher(int, std::string)
 +
  2.09      4.80    0.10        1  100.16  100.16  rc4_init(unsigned char*, unsigned int)
 +
  0.00      4.80    0.00        1    0.00    0.00  _GLOBAL__sub_I_S
 +
 
 +
'''RC4 Cipher - 789 MB iso File'''
 +
 
 +
[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/xu.iso
 +
/home/johny/aes/xu.iso
 +
  * * * File Protector * * *
 +
Mode 4: RC4 cipher
 +
Please enter the RC4 key (8 chars min)
 +
testing123
 +
The password is: testing123
 +
Beginning encryption
 +
Completed: 100%
 +
Cipher completed.
 +
Program terminated.
 +
 
 +
real    0m12.566s
 +
user    0m10.170s
 +
sys    0m0.228s
 +
 
 +
Flat profile:
 +
Each sample counts as 0.01 seconds.
 +
  %  cumulative  self              self    total         
 +
time  seconds  seconds    calls  ms/call  ms/call  name   
 +
75.51      4.40    4.40 827326464    0.00    0.00  rc4_output()
 +
23.02      5.74    1.34                            byteCipher(int, std::string)
 +
  1.63      5.84    0.10        1    95.15    95.15  rc4_init(unsigned char*, unsigned int)
 +
  0.00      5.84    0.00        1    0.00    0.00  _GLOBAL__sub_I_S
 +
 
 +
 
 +
==== Profiling on Windows ====
 +
 
 +
The following test runs were performed on the following Machine:
 +
* Windows 10
 +
* i7-4790k @ 4GHz
 +
* 16GB DDR3
 +
* Visual Studio 2013
 +
 
 +
 
 +
'''RC4 Cipher - 283 MB mp3 File'''
 +
 
 +
[[File:winmp3.png]]
 +
 
 +
 
 +
'''RC4 Cipher - 636 MB iso File'''
 +
 
 +
[[File:wincent.png]]
 +
 
 +
 
 +
'''RC4 Cipher - 789 MB iso File'''
 +
 
 +
[[File:winxu.png]]
 +
 
 +
 
 +
 
 +
'''Byte Cycle - 283 MB mp3 File'''
 +
 
 +
[[File:winmp32.png]]
 +
 
 +
 
 +
'''Byte Cycle - 636 MB iso File'''
 +
 
 +
[[File:wincent2.png]]
 +
 
 +
 
 +
'''Byte Cycle - 789 MB iso File'''
 +
 
 +
[[File:winxu2.png]]
 +
 
 +
=== <span style="color: red">&#x2717; Profile 1: PI Approximation</span> ===  
 +
 
  
 
* Sample run:
 
* Sample run:
Line 31: Line 218:
 
  operation - took - 47.1807910000 secs
 
  operation - took - 47.1807910000 secs
 
  3.1415537704
 
  3.1415537704
operation - took - 47.1643760000 secs
+
 
3.1415782660
 
operation - took - 47.1696770000 secs
 
3.1415815554
 
operation - took - 47.2050050000 secs
 
 
  real    3m33.129s  
 
  real    3m33.129s  
 
  user    3m32.925s  
 
  user    3m32.925s  
Line 49: Line 232:
 
  0.00    106.93    0.00        1    0.00    0.00  _GLOBAL__sub_I__Z10reportTimePKcNSt6chrono8durationIlSt5ratioILl1ELl1000000EEEE
 
  0.00    106.93    0.00        1    0.00    0.00  _GLOBAL__sub_I__Z10reportTimePKcNSt6chrono8durationIlSt5ratioILl1ELl1000000EEEE
  
=== <span style="color: green">&#x2713; Profile 2: Wave Form Generator</span> ===
+
=== <span style="color: red">&#x2717; Profile 2: Wave Form Generator</span> ===
'''This is the program we selected to optimize. It's a great candidate because it has 2 primary functions that have a few for loops in them. One of the functions reads an Mp3 file and writes wave data to a file -- this function takes quite a bit of time to execute. The other function actually takes this data and converts it to a view-able sound wave image. Both functions would benefit greatly from the extra processing power that a GPU provides: mp3 read/decode time would be greatly reduced.'''
+
 
 +
<s>'''This is the program we selected to optimize. It's a great candidate because it has 2 primary functions that have a few for loops in them. One of the functions reads an Mp3 file and writes wave data to a file -- this function takes quite a bit of time to execute. The other function actually takes this data and converts it to a view-able sound wave image. Both functions would benefit greatly from the extra processing power that a GPU provides: mp3 read/decode time would be greatly reduced.'''</s>
 +
 
 +
'This piece of code is too complex and requires a linux environment to run. Please see Profile 0 for the one we are currently using.'
  
 
* Sample Run
 
* Sample Run
Line 103: Line 289:
 
   0.00      7.29    0.00    7272    0.00    0.00  BstdRead
 
   0.00      7.29    0.00    7272    0.00    0.00  BstdRead
 
   0.00      7.29    0.00    7271    0.00    0.00  BstdFileEofP
 
   0.00      7.29    0.00    7271    0.00    0.00  BstdFileEofP
  0.00      7.29    0.00      176    0.00    0.00  __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >::base() const
+
  .....
  0.00      7.29    0.00      144    0.00    0.00  std::string* std::__addressof<std::string>(std::string&)
 
  0.00      7.29    0.00      130    0.00    0.00  std::less<std::string>::operator()(std::string const&, std::string const&) const
 
  0.00      7.29    0.00      130    0.00    0.00  bool std::operator< <char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
 
  0.00      7.29    0.00      129    0.00    0.00  std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >::operator()(std::pair<std::string const, boost::program_options::variable_value> const&) const
 
  0.00      7.29    0.00      117    0.00    0.00  std::vector<short, std::allocator<short> >::size() const
 
  0.00      7.29    0.00      107    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_M_get_Tp_allocator()
 
  0.00      7.29    0.00      99    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_key(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > const*)
 
  0.00      7.29    0.00      99    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_value(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > const*)
 
  0.00      7.29    0.00      97    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::size() const
 
  0.00      7.29    0.00      92    0.00    0.00  __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >::__normal_iterator(std::string const* const&)
 
  0.00      7.29    0.00      91    0.00    0.00  __gnu_cxx::new_allocator<std::string>::~new_allocator()
 
  0.00      7.29    0.00      91    0.00    0.00  std::allocator<std::string>::~allocator()
 
  0.00      7.29    0.00      86    0.00    0.00  std::string&& std::forward<std::string>(std::remove_reference<std::string>::type&)
 
  0.00      7.29    0.00      86    0.00    0.00  void std::_Destroy<std::string>(std::string*)
 
  0.00      7.29    0.00      85    0.00    0.00  std::_Rb_tree_const_iterator<std::pair<std::string const, boost::program_options::variable_value> >::_Rb_tree_const_iterator(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > const*)
 
  0.00      7.29    0.00      84    0.00    0.00  bool __gnu_cxx::operator!=<std::string const*, std::vector<std::string, std::allocator<std::string> > >(__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > > const&, __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > > const&)
 
  0.00      7.29    0.00      80    0.00    0.00  __gnu_cxx::new_allocator<std::string>::new_allocator(__gnu_cxx::new_allocator<std::string> const&)
 
  0.00      7.29    0.00      80    0.00    0.00  std::allocator<std::string>::allocator(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      69    0.00    0.00  __gnu_cxx::new_allocator<short>::max_size() const
 
  0.00      7.29    0.00      69    0.00    0.00  std::_Iter_base<short*, false>::_S_base(short*)
 
  0.00      7.29    0.00      69    0.00    0.00  std::_Niter_base<short*>::iterator_type std::__niter_base<short*>(short*)
 
  0.00      7.29    0.00      65    0.00    0.00  boost::detail::atomic_exchange_and_add(int*, int)
 
  0.00      7.29    0.00      61    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_left(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00      60    0.00    0.00  boost::any::~any()
 
  0.00      7.29    0.00      59    0.00    0.00  void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*)
 
  0.00      7.29    0.00      59    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_M_deallocate(std::string*, unsigned long)
 
  0.00      7.29    0.00      59    0.00    0.00  void std::_Destroy<std::string*>(std::string*, std::string*)
 
  0.00      7.29    0.00      59    0.00    0.00  void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&)
 
  0.00      7.29    0.00      56    0.00    0.00  __gnu_cxx::new_allocator<std::string>::max_size() const
 
  0.00      7.29    0.00      56    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_M_get_Tp_allocator() const
 
  0.00      7.29    0.00      55    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::end() const
 
  0.00      7.29    0.00      54    0.00    0.00  std::remove_reference<boost::any::placeholder*&>::type&& std::move<boost::any::placeholder*&>(boost::any::placeholder*&)
 
  0.00      7.29    0.00      51    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_impl::~_Vector_impl()
 
  0.00      7.29    0.00      51    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::~_Vector_base()
 
  0.00      7.29    0.00      51    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::~vector()
 
  0.00      7.29    0.00      49    0.00    0.00  __gnu_cxx::new_allocator<std::string>::deallocate(std::string*, unsigned long)
 
  0.00      7.29    0.00      48    0.00    0.00  __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >::operator*() const
 
  0.00      7.29    0.00      48    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::begin() const
 
  0.00      7.29    0.00      48    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long)
 
  0.00      7.29    0.00      47    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_M_get_Tp_allocator()
 
  0.00      7.29    0.00      46    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_M_get_Tp_allocator() const
 
  0.00      7.29    0.00      46    0.00    0.00  std::move_iterator<short*>::base() const
 
  0.00      7.29    0.00      46    0.00    0.00  std::vector<short, std::allocator<short> >::max_size() const
 
  0.00      7.29    0.00      46    0.00    0.00  std::_Iter_base<std::move_iterator<short*>, true>::_S_base(std::move_iterator<short*>)
 
  0.00      7.29    0.00      46    0.00    0.00  std::move_iterator<short*>::move_iterator(short*)
 
  0.00      7.29    0.00      46    0.00    0.00  std::enable_if<std::allocator_traits<std::allocator<short> >::__maxsize_helper<std::allocator<short> const>::value, unsigned long>::type std::allocator_traits<std::allocator<short> >::_S_max_size<std::allocator<short> const>(std::allocator<short> const&)
 
  0.00      7.29    0.00      46    0.00    0.00  std::allocator_traits<std::allocator<short> >::max_size(std::allocator<short> const&)
 
  0.00      7.29    0.00      46    0.00    0.00  std::_Miter_base<std::move_iterator<short*> >::iterator_type std::__miter_base<std::move_iterator<short*> >(std::move_iterator<short*>)
 
  0.00      7.29    0.00      46    0.00    0.00  std::move_iterator<short*> std::__make_move_if_noexcept_iterator<short*, std::move_iterator<short*> >(short*)
 
  0.00      7.29    0.00      44    0.00    0.00  __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >::operator++()
 
  0.00      7.29    0.00      44    0.00    0.00  std::move_iterator<std::string*>::base() const
 
  0.00      7.29    0.00      44    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::end() const
 
  0.00      7.29    0.00      44    0.00    0.00  void std::_Construct<std::string, std::string const&>(std::string*, std::string const&)
 
  0.00      7.29    0.00      44    0.00    0.00  std::string const& std::forward<std::string const&>(std::remove_reference<std::string const&>::type&)
 
  0.00      7.29    0.00      40    0.00    0.00  __gnu_cxx::new_allocator<std::string>::allocate(unsigned long, void const*)
 
  0.00      7.29    0.00      40    0.00    0.00  __gnu_cxx::__alloc_traits<std::allocator<std::string> >::_S_select_on_copy(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_impl::_Vector_impl(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_M_create_storage(unsigned long)
 
  0.00      7.29    0.00      40    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_base(unsigned long, std::allocator<std::string> const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::allocator_traits<std::allocator<std::string> >::select_on_container_copy_construction(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::enable_if<!std::allocator_traits<std::allocator<std::string> >::__select_helper<std::allocator<std::string> const>::value, std::allocator<std::string> const>::type std::allocator_traits<std::allocator<std::string> >::_S_select<std::allocator<std::string> const>(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::string* std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*>(__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*)
 
  0.00      7.29    0.00      40    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::vector(std::vector<std::string, std::allocator<std::string> > const&)
 
  0.00      7.29    0.00      40    0.00    0.00  std::string* std::uninitialized_copy<__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*>(__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*)
 
  0.00      7.29    0.00      40    0.00    0.00  std::string* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*, std::string>(__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > >, std::string*, std::allocator<std::string>&)
 
  0.00      7.29    0.00      38    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_right(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00      36    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_get_Tp_allocator()
 
  0.00      7.29    0.00      35    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::~new_allocator()
 
  0.00      7.29    0.00      35    0.00    0.00  std::allocator<boost::program_options::basic_option<char> >::~allocator()
 
  0.00      7.29    0.00      34    0.00    0.00  boost::any::placeholder::~placeholder()
 
  0.00      7.29    0.00      33    0.00    0.00  std::_Rb_tree_const_iterator<std::pair<std::string const, boost::program_options::variable_value> >::operator==(std::_Rb_tree_const_iterator<std::pair<std::string const, boost::program_options::variable_value> > const&) const
 
  0.00      7.29    0.00      33    0.00    0.00  void std::_Destroy_aux<false>::__destroy<boost::program_options::basic_option<char>*>(boost::program_options::basic_option<char>*, boost::program_options::basic_option<char>*)
 
  0.00      7.29    0.00      33    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_impl::~_Vector_impl()
 
  0.00      7.29    0.00      33    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_deallocate(boost::program_options::basic_option<char>*, unsigned long)
 
  0.00      7.29    0.00      33    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::~_Vector_base()
 
  0.00      7.29    0.00      33    0.00    0.00  void std::_Destroy<boost::program_options::basic_option<char>*>(boost::program_options::basic_option<char>*, boost::program_options::basic_option<char>*)
 
  0.00      7.29    0.00      33    0.00    0.00  void std::_Destroy<boost::program_options::basic_option<char>*, boost::program_options::basic_option<char> >(boost::program_options::basic_option<char>*, boost::program_options::basic_option<char>*, std::allocator<boost::program_options::basic_option<char> >&)
 
  0.00      7.29    0.00      32    0.00    0.00  boost::any::placeholder::placeholder()
 
  0.00      7.29    0.00      31    0.00    0.00  boost::detail::shared_count::~shared_count()
 
  0.00      7.29    0.00      31    0.00    0.00  unsigned long const& std::max<unsigned long>(unsigned long const&, unsigned long const&)
 
  0.00      7.29    0.00      30    0.00    0.00  boost::any::any()
 
  0.00      7.29    0.00      30    0.00    0.00  boost::detail::sp_counted_base::release()
 
  0.00      7.29    0.00      30    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > const*, std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > const*, std::string const&) const
 
  0.00      7.29    0.00      30    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_end() const
 
  0.00      7.29    0.00      30    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_begin() const
 
  0.00      7.29    0.00      30    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_key(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00      30    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_value(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00      30    0.00    0.00  std::remove_reference<std::string&>::type&& std::move<std::string&>(std::string&)
 
  0.00      7.29    0.00      24    0.00    0.00  void std::_Destroy_aux<true>::__destroy<short*>(short*, short*)
 
  0.00      7.29    0.00      24    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_M_deallocate(short*, unsigned long)
 
  0.00      7.29    0.00      24    0.00    0.00  boost::program_options::basic_option<char>* std::__addressof<boost::program_options::basic_option<char> >(boost::program_options::basic_option<char>&)
 
  0.00      7.29    0.00      24    0.00    0.00  void std::_Destroy<short*>(short*, short*)
 
  0.00      7.29    0.00      24    0.00    0.00  void std::_Destroy<short*, short>(short*, short*, std::allocator<short>&)
 
  0.00      7.29    0.00      23    0.00    0.00  __gnu_cxx::new_allocator<short>::deallocate(short*, unsigned long)
 
  0.00      7.29    0.00      23    0.00    0.00  __gnu_cxx::new_allocator<short>::allocate(unsigned long, void const*)
 
  0.00      7.29    0.00      23    0.00    0.00  boost::any::empty() const
 
  0.00      7.29    0.00      23    0.00    0.00  std::vector<short, std::allocator<short> >::_M_check_len(unsigned long, char const*) const
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__copy_move<true, true, std::random_access_iterator_tag>::__copy_m<short>(short const*, short const*, short*)
 
  0.00      7.29    0.00      23    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_M_allocate(unsigned long)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__uninitialized_copy<true>::__uninit_copy<std::move_iterator<short*>, short*>(std::move_iterator<short*>, std::move_iterator<short*>, short*)
 
  0.00      7.29    0.00      23    0.00    0.00  void std::vector<short, std::allocator<short> >::_M_emplace_back_aux<short const&>(short const&)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__copy_move_a<true, short*, short*>(short*, short*, short*)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__copy_move_a2<true, short*, short*>(short*, short*, short*)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::uninitialized_copy<std::move_iterator<short*>, short*>(std::move_iterator<short*>, std::move_iterator<short*>, short*)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__uninitialized_copy_a<std::move_iterator<short*>, short*, short>(std::move_iterator<short*>, std::move_iterator<short*>, short*, std::allocator<short>&)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::__uninitialized_move_if_noexcept_a<short*, short*, std::allocator<short> >(short*, short*, short*, std::allocator<short>&)
 
  0.00      7.29    0.00      23    0.00    0.00  short* std::copy<std::move_iterator<short*>, short*>(std::move_iterator<short*>, std::move_iterator<short*>, short*)
 
  0.00      7.29    0.00      22    0.00    0.00  std::type_info::name() const
 
  0.00      7.29    0.00      22    0.00    0.00  bool std::operator==<std::string*>(std::move_iterator<std::string*> const&, std::move_iterator<std::string*> const&)
 
  0.00      7.29    0.00      22    0.00    0.00  bool std::operator!=<std::string*>(std::move_iterator<std::string*> const&, std::move_iterator<std::string*> const&)
 
  0.00      7.29    0.00      20    0.00    0.00  boost::program_options::basic_option<char>::~basic_option()
 
  0.00      7.29    0.00      20    0.00    0.00  boost::any::holder<int>::holder(int const&)
 
  0.00      7.29    0.00      20    0.00    0.00  boost::any::holder<int>::~holder()
 
  0.00      7.29    0.00      20    0.00    0.00  void std::_Destroy<boost::program_options::basic_option<char> >(boost::program_options::basic_option<char>*)
 
  0.00      7.29    0.00      19    0.00    0.00  boost::shared_ptr<boost::program_options::option_description>::~shared_ptr()
 
  0.00      7.29    0.00      19    0.00    0.00  boost::detail::sp_counted_base::weak_release()
 
  0.00      7.29    0.00      19    0.00    0.00  boost::detail::sp_counted_base::destroy()
 
  0.00      7.29    0.00      19    0.00    0.00  boost::shared_ptr<boost::program_options::option_description>* std::__addressof<boost::shared_ptr<boost::program_options::option_description> >(boost::shared_ptr<boost::program_options::option_description>&)
 
  0.00      7.29    0.00      19    0.00    0.00  void std::_Destroy<boost::shared_ptr<boost::program_options::option_description> >(boost::shared_ptr<boost::program_options::option_description>*)
 
  0.00      7.29    0.00      18    0.00    0.00  boost::any::swap(boost::any&)
 
  0.00      7.29    0.00      18    0.00    0.00  boost::any::operator=(boost::any)
 
  0.00      7.29    0.00      18    0.00    0.00  std::remove_reference<boost::program_options::basic_option<char>*&>::type&& std::move<boost::program_options::basic_option<char>*&>(boost::program_options::basic_option<char>*&)
 
  0.00      7.29    0.00      18    0.00    0.00  void std::swap<boost::any::placeholder*>(boost::any::placeholder*&, boost::any::placeholder*&)
 
  0.00      7.29    0.00      16    0.00    0.00  _ZN9__gnu_cxx13new_allocatorISsE9constructISsISsEEEvPT_DpOT0_
 
  0.00      7.29    0.00      16    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::max_size() const
 
  0.00      7.29    0.00      16    0.00    0.00  std::char_traits<char>::assign(char&, char const&)
 
  0.00      7.29    0.00      16    0.00    0.00  std::move_iterator<std::string*>::move_iterator(std::string*)
 
  0.00      7.29    0.00      16    0.00    0.00  std::enable_if<std::allocator_traits<std::allocator<std::string> >::__maxsize_helper<std::allocator<std::string> const>::value, unsigned long>::type std::allocator_traits<std::allocator<std::string> >::_S_max_size<std::allocator<std::string> const>(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      16    0.00    0.00  std::enable_if<std::allocator_traits<std::allocator<std::string> >::__construct_helper<std::string, std::string>::value, void>::type std::allocator_traits<std::allocator<std::string> >::_S_construct<std::string, std::string>(std::allocator<std::string>&, std::string*, std::string&&)
 
  0.00      7.29    0.00      16    0.00    0.00  std::allocator_traits<std::allocator<std::string> >::max_size(std::allocator<std::string> const&)
 
  0.00      7.29    0.00      16    0.00    0.00  _ZNSt16allocator_traitsISaISsEE9constructISsISsEEEDTcl12_S_constructfp_fp0_spcl7forwardIT0_Efp1_EEERS0_PT_DpOS3_
 
  0.00      7.29    0.00      16    0.00    0.00  void std::vector<std::string, std::allocator<std::string> >::emplace_back<std::string>(std::string&&)
 
  0.00      7.29    0.00      16    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::push_back(std::string&&)
 
  0.00      7.29    0.00      16    0.00    0.00  std::move_iterator<std::string*> std::__make_move_if_noexcept_iterator<std::string*, std::move_iterator<std::string*> >(std::string*)
 
  0.00      7.29    0.00      15    0.00    0.00  boost::filesystem::path::~path()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::function_base::function_base()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::value_semantic::value_semantic()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::value_semantic::~value_semantic()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::typed_value_base::typed_value_base()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::typed_value_base::~typed_value_base()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::value_semantic_codecvt_helper<char>::value_semantic_codecvt_helper()
 
  0.00      7.29    0.00      15    0.00    0.00  boost::program_options::value_semantic_codecvt_helper<char>::~value_semantic_codecvt_helper()
 
  0.00      7.29    0.00      15    0.00    0.00  std::char_traits<char>::to_char_type(int const&)
 
  0.00      7.29    0.00      14    0.00    0.00  std::move_iterator<std::string*>::operator*() const
 
  0.00      7.29    0.00      14    0.00    0.00  std::move_iterator<std::string*>::operator++()
 
  0.00      7.29    0.00      14    0.00    0.00  void std::_Construct<std::string, std::string>(std::string*, std::string&&)
 
  0.00      7.29    0.00      12    0.00    0.00  boost::shared_ptr<boost::program_options::value_semantic const>::~shared_ptr()
 
  0.00      7.29    0.00      12    0.00    0.00  boost::any::holder<int>::~holder()
 
  0.00      7.29    0.00      11    0.00    0.00  boost::program_options::variable_value::~variable_value()
 
  0.00      7.29    0.00      11    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::deallocate(boost::program_options::basic_option<char>*, unsigned long)
 
  0.00      7.29    0.00      11    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >*, unsigned long)
 
  0.00      7.29    0.00      11    0.00    0.00  void __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > >::destroy<std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > >(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >*)
 
  0.00      7.29    0.00      11    0.00    0.00  boost::function_base::empty() const
 
  0.00      7.29    0.00      11    0.00    0.00  boost::any::type() const
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >::~_Rb_tree_node()
 
  0.00      7.29    0.00      11    0.00    0.00  std::pair<std::string const, boost::program_options::variable_value>::~pair()
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >*)
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >*)
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_get_Node_allocator()
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_left(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00      11    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_S_right(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00      10    0.00    0.00  boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::lexical_stream_limited_src(char*, char*)
 
  0.00      7.29    0.00      10    0.00    0.00  __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >::base() const
 
  0.00      7.29    0.00        9    0.00    0.00  boost::filesystem::path::path(char const*)
 
  0.00      7.29    0.00        9    0.00    0.00  boost::filesystem::operator==(boost::filesystem::path const&, char const*)
 
  0.00      7.29    0.00        9    0.00    0.00  boost::filesystem::path::compare(char const*) const
 
  0.00      7.29    0.00        8    0.00    0.00  RGBA::RGBA(int, int, int, int)
 
  0.00      7.29    0.00        8    0.00    0.00  boost::any::holder<double>::holder(double const&)
 
  0.00      7.29    0.00        8    0.00    0.00  boost::any::holder<double>::~holder()
 
  0.00      7.29    0.00        8    0.00    0.00  boost::any::any<int>(int const&)
 
  0.00      7.29    0.00        8    0.00    0.00  bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::operator>><std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
 
  0.00      7.29    0.00        8    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::string> >::deallocate(std::_Rb_tree_node<std::string>*, unsigned long)
 
  0.00      7.29    0.00        8    0.00    0.00  void __gnu_cxx::new_allocator<std::_Rb_tree_node<std::string> >::destroy<std::_Rb_tree_node<std::string> >(std::_Rb_tree_node<std::string>*)
 
  0.00      7.29    0.00        8    0.00    0.00  boost::program_options::variables_map::operator[](std::string const&) const
 
  0.00      7.29    0.00        8    0.00    0.00  std::locale::operator!=(std::locale const&) const
 
  0.00      7.29    0.00        8    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::_M_check_len(unsigned long, char const*) const
 
  0.00      7.29    0.00        8    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::operator[](unsigned long) const
 
  0.00      7.29    0.00        8    0.00    0.00  std::string& std::string::assign<char*>(char*, char*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree_node<std::string>::~_Rb_tree_node()
 
  0.00      7.29    0.00        8    0.00    0.00  std::string* std::__uninitialized_copy<false>::__uninit_copy<std::move_iterator<std::string*>, std::string*>(std::move_iterator<std::string*>, std::move_iterator<std::string*>, std::string*)
 
  0.00      7.29    0.00        8    0.00    0.00  void std::vector<std::string, std::allocator<std::string> >::_M_emplace_back_aux<std::string>(std::string&&)
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_M_put_node(std::_Rb_tree_node<std::string>*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_M_destroy_node(std::_Rb_tree_node<std::string>*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_M_get_Node_allocator()
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_S_left(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_S_right(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::string* std::uninitialized_copy<std::move_iterator<std::string*>, std::string*>(std::move_iterator<std::string*>, std::move_iterator<std::string*>, std::string*)
 
  0.00      7.29    0.00        8    0.00    0.00  std::string* std::__uninitialized_copy_a<std::move_iterator<std::string*>, std::string*, std::string>(std::move_iterator<std::string*>, std::move_iterator<std::string*>, std::string*, std::allocator<std::string>&)
 
  0.00      7.29    0.00        8    0.00    0.00  std::string* std::__uninitialized_move_if_noexcept_a<std::string*, std::string*, std::allocator<std::string> >(std::string*, std::string*, std::string*, std::allocator<std::string>&)
 
  0.00      7.29    0.00        7    0.00    0.00  boost::any::any(boost::any const&)
 
  0.00      7.29    0.00        6    0.00    0.00  std::string boost::lexical_cast<std::string, int>(int const&)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::program_options::typed_value<int, char>::default_value(int const&)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::program_options::typed_value<int, char>::typed_value(int*)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::program_options::typed_value<int, char>::~typed_value()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::program_options::typed_value<int, char>* boost::program_options::value<int>(int*)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::any::holder<std::string>::~holder()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::detail::lcast_src_length<int>::check_coverage()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::make_unsigned<int>::type boost::detail::lcast_to_unsigned<int>(int)
 
  0.00      7.29    0.00        6    0.00    0.00  char* boost::detail::lcast_put_unsigned<std::char_traits<char>, unsigned int, char>(unsigned int, char*)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::detail::lexical_cast_do_cast<std::string, int>::lexical_cast_impl(int const&)
 
  0.00      7.29    0.00        6    0.00    0.00  bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::shl_signed<int>(int)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::operator<<(int)
 
  0.00      7.29    0.00        6    0.00    0.00  int const* boost::any_cast<int>(boost::any const*)
 
  0.00      7.29    0.00        6    0.00    0.00  int* boost::any_cast<int>(boost::any*)
 
  0.00      7.29    0.00        6    0.00    0.00  boost::function1<void, int const&>::clear()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::function1<void, int const&>::function1()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::function1<void, int const&>::~function1()
 
  0.00      7.29    0.00        6    0.00    0.00  boost::any::holder<int>::type() const
 
  0.00      7.29    0.00        6    0.00    0.00  boost::function1<void, int const&>::operator void (boost::function1<void, int const&>::dummy::*)()() const
 
  0.00      7.29    0.00        6    0.00    0.00  std::unary_function<int const&, void>::unary_function()
 
  0.00      7.29    0.00        6    0.00    0.00  void std::swap<boost::program_options::basic_option<char>*>(boost::program_options::basic_option<char>*&, boost::program_options::basic_option<char>*&)
 
  0.00      7.29    0.00        5    0.00    0.00  bool __gnu_cxx::operator!=<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >(__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > > const&, __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > > const&)
 
  0.00      7.29    0.00        4    0.00    0.00  hasOptionValue(boost::program_options::variables_map const&, char const*)
 
  0.00      7.29    0.00        4    0.00    0.00  RGBA::RGBA()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::typed_value<RGBA, char>::typed_value(RGBA*)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::typed_value<RGBA, char>::~typed_value()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::basic_option<char>::basic_option(boost::program_options::basic_option<char> const&)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::typed_value<RGBA, char>* boost::program_options::value<RGBA>(RGBA*)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::any::holder<std::string>::holder(std::string const&)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::any::holder<std::string>::~holder()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::any::holder<double>::~holder()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::function1<void, RGBA const&>::clear()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::function1<void, RGBA const&>::function1()
 
  0.00      7.29    0.00        4    0.00    0.00  boost::function1<void, RGBA const&>::~function1()
 
  0.00      7.29    0.00        4    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::new_allocator(__gnu_cxx::new_allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        4    0.00    0.00  __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >::operator++()
 
  0.00      7.29    0.00        4    0.00    0.00  bool __gnu_cxx::operator==<std::string const*, std::vector<std::string, std::allocator<std::string> > >(__gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > > const&, __gnu_cxx::__normal_iterator<std::string const*, std::vector<std::string, std::allocator<std::string> > > const&)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::variable_value::empty() const
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::variable_value::defaulted() const
 
  0.00      7.29    0.00        4    0.00    0.00  boost::any::holder<int>::clone() const
 
  0.00      7.29    0.00        4    0.00    0.00  __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >::operator*() const
 
  0.00      7.29    0.00        4    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::empty() const
 
  0.00      7.29    0.00        4    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::front() const
 
  0.00      7.29    0.00        4    0.00    0.00  std::allocator<boost::program_options::basic_option<char> >::allocator(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        4    0.00    0.00  std::char_traits<char>::eq(char const&, char const&)
 
  0.00      7.29    0.00        4    0.00    0.00  std::unary_function<RGBA const&, void>::unary_function()
 
  0.00      7.29    0.00        4    0.00    0.00  std::_Rb_tree_iterator<std::pair<std::string const, std::string> >::_Rb_tree_iterator(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
 
  0.00      7.29    0.00        4    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::~vector()
 
  0.00      7.29    0.00        4    0.00    0.00  void std::_Construct<boost::program_options::basic_option<char>, boost::program_options::basic_option<char> const&>(boost::program_options::basic_option<char>*, boost::program_options::basic_option<char> const&)
 
  0.00      7.29    0.00        4    0.00    0.00  boost::program_options::basic_option<char> const& std::forward<boost::program_options::basic_option<char> const&>(std::remove_reference<boost::program_options::basic_option<char> const&>::type&)
 
  0.00      7.29    0.00        3    0.00    0.00  writeInt32(std::ostream&, int)
 
  0.00      7.29    0.00        3    0.00    0.00  boost::program_options::typed_value<std::string, char>::typed_value(std::string*)
 
  0.00      7.29    0.00        3    0.00    0.00  boost::program_options::typed_value<std::string, char>::~typed_value()
 
  0.00      7.29    0.00        3    0.00    0.00  boost::program_options::typed_value<std::string, char>* boost::program_options::value<std::string>(std::string*)
 
  0.00      7.29    0.00        3    0.00    0.00  std::string const* boost::any_cast<std::string>(boost::any const*)
 
  0.00      7.29    0.00        3    0.00    0.00  std::string* boost::any_cast<std::string>(boost::any*)
 
  0.00      7.29    0.00        3    0.00    0.00  boost::function1<void, std::string const&>::clear()
 
  0.00      7.29    0.00        3    0.00    0.00  boost::function1<void, std::string const&>::function1()
 
  0.00      7.29    0.00        3    0.00    0.00  boost::function1<void, std::string const&>::~function1()
 
  0.00      7.29    0.00        3    0.00    0.00  boost::function_base::has_trivial_copy_and_destroy() const
 
  0.00      7.29    0.00        3    0.00    0.00  boost::any::holder<std::string>::type() const
 
  0.00      7.29    0.00        3    0.00    0.00  boost::function1<void, std::string const&>::operator void (boost::function1<void, std::string const&>::dummy::*)()() const
 
  0.00      7.29    0.00        3    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::get() const
 
  0.00      7.29    0.00        3    0.00    0.00  std::map<std::string, boost::program_options::variable_value, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::count(std::string const&) const
 
  0.00      7.29    0.00        3    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::find(std::string const&) const
 
  0.00      7.29    0.00        3    0.00    0.00  std::_Head_base<0ul, AudioFileReader*, false>::_M_head(std::_Head_base<0ul, AudioFileReader*, false> const&)
 
  0.00      7.29    0.00        3    0.00    0.00  std::_Tuple_impl<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >::_M_head(std::_Tuple_impl<0ul, AudioFileReader*, std::default_delete<AudioFileReader> > const&)
 
  0.00      7.29    0.00        3    0.00    0.00  std::unary_function<std::string const&, void>::unary_function()
 
  0.00      7.29    0.00        3    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_end()
 
  0.00      7.29    0.00        3    0.00    0.00  std::__add_c_ref<AudioFileReader*>::type std::__get_helper<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >(std::_Tuple_impl<0ul, AudioFileReader*, std::default_delete<AudioFileReader> > const&)
 
  0.00      7.29    0.00        3    0.00    0.00  std::__add_c_ref<std::tuple_element<0ul, std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> > >::type>::type std::get<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >(std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> > const&)
 
  0.00      7.29    0.00        3    0.00    0.00  std::remove_reference<ScaleFactor*&>::type&& std::move<ScaleFactor*&>(ScaleFactor*&)
 
  0.00      7.29    0.00        3    0.00    0.00  std::remove_reference<AudioFileReader*&>::type&& std::move<AudioFileReader*&>(AudioFileReader*&)
 
  0.00      7.29    0.00        2    0.00    0.00  writeUInt32(std::ostream&, unsigned int)
 
  0.00      7.29    0.00        2    0.00    0.00  WaveformColors::WaveformColors(RGBA const&, RGBA const&, RGBA const&, RGBA const&)
 
  0.00      7.29    0.00        2    0.00    0.00  Mp3AudioFileReader::close()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::filesystem::path::path(std::string const&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::string boost::lexical_cast<std::string, double>(double const&)
 
  0.00      7.29    0.00        2    0.00    0.00  int boost::lexical_cast<int, std::string>(std::string const&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::typed_value<std::string, char>::required()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::typed_value<double, char>::default_value(double const&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::typed_value<double, char>::typed_value(double*)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::typed_value<double, char>::~typed_value()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::basic_parsed_options<char>::~basic_parsed_options()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::program_options::typed_value<double, char>* boost::program_options::value<double>(double*)
 
  0.00      7.29    0.00        2    0.00    0.00  void boost::program_options::validate<int, char>(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, int*, long)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::any::any<double>(double const&)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::math::isinf<double>(double)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::math::isnan<double>(double)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::math::detail::isinf_impl<double>(double, boost::math::detail::native_tag const&)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::math::detail::isnan_impl<double>(double, boost::math::detail::native_tag const&)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::detail::put_inf_nan<char, double>(char*, char*&, double const&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lcast_src_length<std::string>::check_coverage()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lcast_src_length<double>::check_coverage()
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::detail::put_inf_nan_impl<char, double>(char*, char*&, double const&, char const*, char const*)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::detail::lcast_ret_unsigned<std::char_traits<char>, unsigned int, char>(unsigned int&, char const*, char const*)
 
  0.00      7.29    0.00        2    0.00    0.00  long boost::detail::lcast_get_precision<double>(double*)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lexical_cast_do_cast<std::string, double>::lexical_cast_impl(double const&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lexical_cast_do_cast<int, std::string>::lexical_cast_impl(std::string const&)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::shr_signed<int>(int&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::shl_real_type(double, char*, char*&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::operator<<(double)
 
  0.00      7.29    0.00        2    0.00    0.00  bool boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::operator<< <std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::detail::lexical_stream_limited_src<char, std::char_traits<char>, false>::operator>>(int&)
 
  0.00      7.29    0.00        2    0.00    0.00  double const* boost::any_cast<double>(boost::any const*)
 
  0.00      7.29    0.00        2    0.00    0.00  double* boost::any_cast<double>(boost::any*)
 
  0.00      7.29    0.00        2    0.00    0.00  boost::function1<void, double const&>::clear()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::function1<void, double const&>::function1()
 
  0.00      7.29    0.00        2    0.00    0.00  boost::function1<void, double const&>::~function1()
 
  0.00      7.29    0.00        2    0.00    0.00  __gnu_cxx::new_allocator<std::string>::new_allocator()
 
  0.00      7.29    0.00        2    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, std::string> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, std::string> >*, unsigned long)
 
  0.00      7.29    0.00        2    0.00    0.00  void __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, std::string> > >::destroy<std::_Rb_tree_node<std::pair<std::string const, std::string> > >(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
 
  0.00      7.29    0.00        2    0.00    0.00  __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >::__normal_iterator(boost::program_options::basic_option<char> const* const&)
 
  0.00      7.29    0.00        2    0.00    0.00  WaveformBuffer::getSize() const
 
  0.00      7.29    0.00        2    0.00    0.00  boost::filesystem::path::c_str() const
 
  0.00      7.29    0.00        2    0.00    0.00  boost::any::holder<double>::type() const
 
  0.00      7.29    0.00        2    0.00    0.00  boost::any::holder<double>::clone() const
 
  0.00      7.29    0.00        2    0.00    0.00  boost::function1<void, double const&>::operator void (boost::function1<void, double const&>::dummy::*)()() const
 
  0.00      7.29    0.00        2    0.00    0.00  Options::hasEndTime() const
 
  0.00      7.29    0.00        2    0.00    0.00  Options::hasPixelsPerSecond() const
 
  0.00      7.29    0.00        2    0.00    0.00  Options::hasSamplesPerPixel() const
 
  0.00      7.29    0.00        2    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::operator->() const
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_get_Tp_allocator() const
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree_const_iterator<std::pair<std::string const, std::string> >::_M_const_cast() const
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::size() const
 
  0.00      7.29    0.00        2    0.00    0.00  std::allocator<std::string>::allocator()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Head_base<0ul, ScaleFactor*, false>::_M_head(std::_Head_base<0ul, ScaleFactor*, false>&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Head_base<0ul, AudioFileReader*, false>::_M_head(std::_Head_base<0ul, AudioFileReader*, false>&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Tuple_impl<0ul, ScaleFactor*, std::default_delete<ScaleFactor> >::_M_head(std::_Tuple_impl<0ul, ScaleFactor*, std::default_delete<ScaleFactor> >&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Tuple_impl<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >::_M_head(std::_Tuple_impl<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::char_traits<char>::length(char const*)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_impl::_M_swap_data(std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_impl&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_impl::_Vector_impl(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_impl::_Vector_impl()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Vector_base<std::string, std::allocator<std::string> >::_Vector_base()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree_node<std::pair<std::string const, std::string> >::~_Rb_tree_node()
 
  0.00      7.29    0.00        2    0.00    0.00  std::numeric_limits<unsigned int>::max()
 
  0.00      7.29    0.00        2    0.00    0.00  std::unary_function<double const&, void>::unary_function()
 
  0.00      7.29    0.00        2    0.00    0.00  std::pair<std::string const, std::string>::~pair()
 
  0.00      7.29    0.00        2    0.00    0.00  std::vector<std::string, std::allocator<std::string> >::vector()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_rightmost()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_get_Node_allocator()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_S_left(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_begin()
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_S_right(std::_Rb_tree_node_base*)
 
  0.00      7.29    0.00        2    0.00    0.00  _ZSt12__get_helperILm0EP11ScaleFactorISt14default_deleteIS0_EEENSt9__add_refIT0_E4typeERSt11_Tuple_implIXT_EIS5_DpT1_EE
 
  0.00      7.29    0.00        2    0.00    0.00  _ZSt12__get_helperILm0EP15AudioFileReaderISt14default_deleteIS0_EEENSt9__add_refIT0_E4typeERSt11_Tuple_implIXT_EIS5_DpT1_EE
 
  0.00      7.29    0.00        2    0.00    0.00  std::__add_ref<std::tuple_element<0ul, std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> > >::type>::type std::get<0ul, ScaleFactor*, std::default_delete<ScaleFactor> >(std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> >&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::__add_ref<std::tuple_element<0ul, std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> > >::type>::type std::get<0ul, AudioFileReader*, std::default_delete<AudioFileReader> >(std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> >&)
 
  0.00      7.29    0.00        2    0.00    0.00  std::isinf(double)
 
  0.00      7.29    0.00        2    0.00    0.00  std::isnan(double)
 
  0.00      7.29    0.00        2    0.00    0.00  std::_Rb_tree_node<std::pair<std::string const, std::string> >*& std::forward<std::_Rb_tree_node<std::pair<std::string const, std::string> >*&>(std::remove_reference<std::_Rb_tree_node<std::pair<std::string const, std::string> >*&>::type&)
 
  0.00      7.29    0.00        1    0.00    0.00  BstdFileDestroy
 
  0.00      7.29    0.00        1    0.00    0.00  NewBstdFile
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN11ScaleFactorD2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN13OptionHandlerC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN13WavFileWriterC2EPKc
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN14WaveformBufferC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN14WaveformColorsC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN15AudioFileReaderC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN15GdImageRendererC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN16WaveformRescalerC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN18Mp3AudioFileReaderC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN22SndFileAudioFileReaderC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN4RGBAC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I__ZN7OptionsC2Ev
 
  0.00      7.29    0.00        1    0.00    0.00  _GLOBAL__sub_I_output_stream
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  __static_initialization_and_destruction_0(int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  createScaleFactor(Options const&)
 
  0.00      7.29    0.00        1    0.00    0.00  createAudioFileReader(boost::filesystem::path const&)
 
  0.00      7.29    0.00        1    0.00    0.00  ScaleFactor::ScaleFactor()
 
  0.00      7.29    0.00        1    0.00    0.00  ScaleFactor::~ScaleFactor()
 
  0.00      7.29    0.00        1    0.00    7.29  OptionHandler::generateWaveformData(boost::filesystem::path const&, boost::filesystem::path const&, Options const&)
 
  0.00      7.29    0.00        1    0.00    7.29  OptionHandler::run(Options const&)
 
  0.00      7.29    0.00        1    0.00    0.00  OptionHandler::OptionHandler()
 
  0.00      7.29    0.00        1    0.00    0.00  AudioProcessor::AudioProcessor()
 
  0.00      7.29    0.00        1    0.00    0.00  AudioProcessor::~AudioProcessor()
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformBuffer::setSampleRate(int)
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformBuffer::setSamplesPerPixel(int)
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformBuffer::WaveformBuffer()
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformBuffer::~WaveformBuffer()
 
  0.00      7.29    0.00        1    0.00    0.00  AudioFileReader::AudioFileReader()
 
  0.00      7.29    0.00        1    0.00    0.00  AudioFileReader::~AudioFileReader()
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformGenerator::done()
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformGenerator::init(int, int, int)
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformGenerator::WaveformGenerator(WaveformBuffer&, ScaleFactor const&)
 
  0.00      7.29    0.00        1    0.00    0.00  WaveformGenerator::~WaveformGenerator()
 
  0.00      7.29    0.00        1    0.00    0.00  Mp3AudioFileReader::open(char const*)
 
  0.00      7.29    0.00        1    0.00    0.00  Mp3AudioFileReader::Mp3AudioFileReader()
 
  0.00      7.29    0.00        1    0.00    0.00  Mp3AudioFileReader::~Mp3AudioFileReader()
 
  0.00      7.29    0.00        1    0.00    0.00  Mp3AudioFileReader::~Mp3AudioFileReader()
 
  0.00      7.29    0.00        1    0.00    0.00  SamplesPerPixelScaleFactor::SamplesPerPixelScaleFactor(int)
 
  0.00      7.29    0.00        1    0.00    0.00  SamplesPerPixelScaleFactor::~SamplesPerPixelScaleFactor()
 
  0.00      7.29    0.00        1    0.00    0.00  SamplesPerPixelScaleFactor::~SamplesPerPixelScaleFactor()
 
  0.00      7.29    0.00        1    0.00    0.00  std::string boost::lexical_cast<std::string, std::string>(std::string const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<std::string, std::allocator<std::string> > boost::program_options::to_internal<std::string>(std::vector<std::string, std::allocator<std::string> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::typed_value<std::string, char>::default_value(std::string const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::variables_map::~variables_map()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::options_description::~options_description()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_parsed_options<char>::basic_parsed_options(boost::program_options::options_description const*, int)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_parsed_options<char>::basic_parsed_options(boost::program_options::basic_parsed_options<char> const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::abstract_variables_map::~abstract_variables_map()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_command_line_parser<char>::run()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_command_line_parser<char>::~basic_command_line_parser()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > boost::program_options::detail::make_vector<char, char const* const*>(char const* const*, char const* const*)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::detail::cmdline::~cmdline()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::any::any<std::string>(std::string const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::detail::lexical_cast_copy<std::string>::lexical_cast_impl(std::string const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::function1<std::pair<std::string, std::string>, std::string const&>::clear()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::function1<std::pair<std::string, std::string>, std::string const&>::~function1()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::function1<std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >, std::vector<std::string, std::allocator<std::string> >&>::clear()
 
  0.00      7.29    0.00        1    0.00    0.00  boost::function1<std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >, std::vector<std::string, std::allocator<std::string> >&>::~function1()
 
  0.00      7.29    0.00        1    0.00    0.00  Options::parseCommandLine(int, char const* const*)
 
  0.00      7.29    0.00        1    0.00    0.00  Options::Options()
 
  0.00      7.29    0.00        1    0.00    0.00  Options::~Options()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::shared_ptr<boost::program_options::option_description> >::deallocate(boost::shared_ptr<boost::program_options::option_description>*, unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::shared_ptr<boost::program_options::option_description> >::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::shared_ptr<boost::program_options::options_description> >::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::allocate(unsigned long, void const*)
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::string> >::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > >::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, std::string> > >::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<unsigned long>::deallocate(unsigned long*, unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<unsigned long>::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<short>::new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<short>::~new_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::__alloc_traits<std::allocator<boost::program_options::basic_option<char> > >::_S_select_on_copy(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::__alloc_traits<std::allocator<boost::program_options::basic_option<char> > >::_S_propagate_on_move_assign()
 
  0.00      7.29    0.00        1    0.00    0.02  WaveformBuffer::save(char const*, int) const
 
  0.00      7.29    0.00        1    0.00    0.00  SamplesPerPixelScaleFactor::getSamplesPerPixel(int) const
 
  0.00      7.29    0.00        1    0.00    0.00  boost::any::holder<std::string>::clone() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getVersion() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getInputFilename() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getOutputFilename() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getSamplesPerPixel() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getBits() const
 
  0.00      7.29    0.00        1    0.00    0.00  Options::getHelp() const
 
  0.00      7.29    0.00        1    0.00    0.00  __gnu_cxx::new_allocator<boost::program_options::basic_option<char> >::max_size() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Select1st<std::pair<std::string const, std::string> >::operator()(std::pair<std::string const, std::string> const&) const
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<ScaleFactor, std::default_delete<ScaleFactor> >::get() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<ScaleFactor, std::default_delete<ScaleFactor> >::operator*() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::operator bool() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::get_allocator() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::default_delete<ScaleFactor>::operator()(ScaleFactor*) const
 
  0.00      7.29    0.00        1    0.00    0.00  std::default_delete<AudioFileReader>::operator()(AudioFileReader*) const
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree_iterator<std::pair<std::string const, std::string> >::operator==(std::_Rb_tree_iterator<std::pair<std::string const, std::string> > const&) const
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::end() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::size() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::begin() const
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<boost::shared_ptr<boost::program_options::option_description> >::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<boost::shared_ptr<boost::program_options::options_description> >::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<boost::program_options::basic_option<char> >::allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<std::_Rb_tree_node<std::string> >::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> > >::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<std::_Rb_tree_node<std::pair<std::string const, std::string> > >::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<unsigned long>::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<short>::allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator<short>::~allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Head_base<0ul, ScaleFactor*, false>::_M_head(std::_Head_base<0ul, ScaleFactor*, false> const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Head_base<1ul, std::default_delete<ScaleFactor>, true>::_M_head(std::_Head_base<1ul, std::default_delete<ScaleFactor>, true>&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Head_base<1ul, std::default_delete<AudioFileReader>, true>::_M_head(std::_Head_base<1ul, std::default_delete<AudioFileReader>, true>&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<ScaleFactor, std::default_delete<ScaleFactor> >::get_deleter()
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<ScaleFactor, std::default_delete<ScaleFactor> >::reset(ScaleFactor*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<ScaleFactor, std::default_delete<ScaleFactor> >::~unique_ptr()
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::get_deleter()
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::reset(AudioFileReader*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> >::~unique_ptr()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Tuple_impl<0ul, ScaleFactor*, std::default_delete<ScaleFactor> >::_M_head(std::_Tuple_impl<0ul, ScaleFactor*, std::default_delete<ScaleFactor> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Tuple_impl<1ul, std::default_delete<AudioFileReader> >::_M_head(std::_Tuple_impl<1ul, std::default_delete<AudioFileReader> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Tuple_impl<1ul, std::default_delete<ScaleFactor> >::_M_head(std::_Tuple_impl<1ul, std::default_delete<ScaleFactor> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy_aux<false>::__destroy<boost::shared_ptr<boost::program_options::option_description>*>(boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description>*)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy_aux<false>::__destroy<boost::shared_ptr<boost::program_options::options_description>*>(boost::shared_ptr<boost::program_options::options_description>*, boost::shared_ptr<boost::program_options::options_description>*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::_Vector_impl::~_Vector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::_M_deallocate(boost::shared_ptr<boost::program_options::option_description>*, unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::_M_get_Tp_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::~_Vector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::options_description>, std::allocator<boost::shared_ptr<boost::program_options::options_description> > >::_Vector_impl::~_Vector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::options_description>, std::allocator<boost::shared_ptr<boost::program_options::options_description> > >::_M_deallocate(boost::shared_ptr<boost::program_options::options_description>*, unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00 std::_Vector_base<boost::shared_ptr<boost::program_options::options_description>, std::allocator<boost::shared_ptr<boost::program_options::options_description> > >::_M_get_Tp_allocator()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::shared_ptr<boost::program_options::options_description>, std::allocator<boost::shared_ptr<boost::program_options::options_description> > >::~_Vector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_allocate(unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_impl::_Vector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_create_storage(unsigned long)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_base(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_base(unsigned long, std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_Vector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_Vector_impl::_Vector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_Vector_impl::~_Vector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::_Vector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Vector_base<short, std::allocator<short> >::~_Vector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Bvector_base<std::allocator<bool> >::_Bvector_impl::~_Bvector_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Bvector_base<std::allocator<bool> >::_M_deallocate()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Bvector_base<std::allocator<bool> >::~_Bvector_base()
 
  0.00      7.29    0.00        1    0.00    0.00  std::allocator_traits<std::allocator<boost::program_options::basic_option<char> > >::select_on_container_copy_construction(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::enable_if<!std::allocator_traits<std::allocator<boost::program_options::basic_option<char> > >::__select_helper<std::allocator<boost::program_options::basic_option<char> > const>::value, std::allocator<boost::program_options::basic_option<char> > const>::type std::allocator_traits<std::allocator<boost::program_options::basic_option<char> > >::_S_select<std::allocator<boost::program_options::basic_option<char> > const>(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_option<char>* std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*>(__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::map<std::string, boost::program_options::variable_value, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::~map()
 
  0.00      7.29    0.00        1    0.00    0.00  std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::~map()
 
  0.00      7.29    0.00        1    0.00    0.00  std::set<std::string, std::less<std::string>, std::allocator<std::string> >::~set()
 
  0.00      7.29    0.00        1    0.00    0.00  std::pair<std::_Rb_tree_node_base*, std::_Rb_tree_node_base*>::pair<std::_Rb_tree_node<std::pair<std::string const, std::string> >*&, std::_Rb_tree_node<std::pair<std::string const, std::string> >*&, void>(std::_Rb_tree_node<std::pair<std::string const, std::string> >*&, std::_Rb_tree_node<std::pair<std::string const, std::string> >*&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::pair<std::_Rb_tree_node_base*, std::_Rb_tree_node_base*>::pair<std::_Rb_tree_node_base*&, void>(std::_Rb_tree_node_base* const&, std::_Rb_tree_node_base*&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::~vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::shared_ptr<boost::program_options::options_description>, std::allocator<boost::shared_ptr<boost::program_options::options_description> > >::~vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::_M_move_assign(std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >&&, std::integral_constant<bool, true>)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::vector(std::allocator<boost::program_options::basic_option<char> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::vector(std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >::operator=(std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >&&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<bool, std::allocator<bool> >::~vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<short, std::allocator<short> >::vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::vector<short, std::allocator<short> >::~vector()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_Rb_tree_impl<std::less<std::string>, true>::~_Rb_tree_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_M_begin()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::_M_erase(std::_Rb_tree_node<std::string>*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::string, std::_Identity<std::string>, std::less<std::string>, std::allocator<std::string> >::~_Rb_tree()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_Rb_tree_impl<std::less<std::string>, true>::~_Rb_tree_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_begin()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, boost::program_options::variable_value> >*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, boost::program_options::variable_value>, std::_Select1st<std::pair<std::string const, boost::program_options::variable_value> >, std::less<std::string>, std::allocator<std::pair<std::string const, boost::program_options::variable_value> > >::~_Rb_tree()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_Rb_tree_impl<std::less<std::string>, true>::~_Rb_tree_impl()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_get_insert_unique_pos(std::string const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::begin()
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_S_key(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_erase(std::_Rb_tree_node<std::pair<std::string const, std::string> >*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_S_value(std::_Rb_tree_node_base const*)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::~_Rb_tree()
 
  0.00      7.29    0.00        1    0.00    0.00  _ZSt12__get_helperILm0EP11ScaleFactorISt14default_deleteIS0_EEENSt11__add_c_refIT0_E4typeERKSt11_Tuple_implIXT_EIS5_DpT1_EE
 
  0.00      7.29    0.00        1    0.00    0.00  std::__add_ref<std::default_delete<ScaleFactor> >::type std::__get_helper<1ul, std::default_delete<ScaleFactor>>(std::_Tuple_impl<1ul, std::default_delete<ScaleFactor>>&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::__add_ref<std::default_delete<AudioFileReader> >::type std::__get_helper<1ul, std::default_delete<AudioFileReader>>(std::_Tuple_impl<1ul, std::default_delete<AudioFileReader>>&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::__alloc_on_move<std::allocator<boost::program_options::basic_option<char> > >(std::allocator<boost::program_options::basic_option<char> >&, std::allocator<boost::program_options::basic_option<char> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::__do_alloc_on_move<std::allocator<boost::program_options::basic_option<char> > >(std::allocator<boost::program_options::basic_option<char> >&, std::allocator<boost::program_options::basic_option<char> >&, std::integral_constant<bool, true>)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_option<char>* std::uninitialized_copy<__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*>(__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*)
 
  0.00      7.29    0.00        1    0.00    0.00  boost::program_options::basic_option<char>* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*, boost::program_options::basic_option<char> >(__gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, __gnu_cxx::__normal_iterator<boost::program_options::basic_option<char> const*, std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > > >, boost::program_options::basic_option<char>*, std::allocator<boost::program_options::basic_option<char> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::__add_c_ref<std::tuple_element<0ul, std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> > >::type>::type std::get<0ul, ScaleFactor*, std::default_delete<ScaleFactor> >(std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> > const&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::__add_ref<std::tuple_element<1ul, std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> > >::type>::type std::get<1ul, AudioFileReader*, std::default_delete<AudioFileReader> >(std::tuple<AudioFileReader*, std::default_delete<AudioFileReader> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::__add_ref<std::tuple_element<1ul, std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> > >::type>::type std::get<1ul, ScaleFactor*, std::default_delete<ScaleFactor> >(std::tuple<ScaleFactor*, std::default_delete<ScaleFactor> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::remove_reference<std::allocator<boost::program_options::basic_option<char> >&>::type&& std::move<std::allocator<boost::program_options::basic_option<char> >&>(std::allocator<boost::program_options::basic_option<char> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::remove_reference<std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >&>::type&& std::move<std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >&>(std::vector<boost::program_options::basic_option<char>, std::allocator<boost::program_options::basic_option<char> > >&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::swap<ScaleFactor*>(ScaleFactor*&, ScaleFactor*&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::swap<AudioFileReader*>(AudioFileReader*&, AudioFileReader*&)
 
  0.00      7.29    0.00        1    0.00    0.00  std::_Rb_tree_node_base*& std::forward<std::_Rb_tree_node_base*&>(std::remove_reference<std::_Rb_tree_node_base*&>::type&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy<boost::shared_ptr<boost::program_options::option_description>*>(boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description>*)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy<boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description> >(boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description>*, std::allocator<boost::shared_ptr<boost::program_options::option_description> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy<boost::shared_ptr<boost::program_options::options_description>*>(boost::shared_ptr<boost::program_options::options_description>*, boost::shared_ptr<boost::program_options::options_description>*)
 
  0.00      7.29    0.00        1    0.00    0.00  void std::_Destroy<boost::shared_ptr<boost::program_options::options_description>*, boost::shared_ptr<boost::program_options::options_description> >(boost::shared_ptr<boost::program_options::options_description>*, boost::shared_ptr<boost::program_options::options_description>*, std::allocator<boost::shared_ptr<boost::program_options::options_description> >&)
 
  0.00      7.29    0.00        1    0.00    0.00  bool std::operator==<AudioFileReader, std::default_delete<AudioFileReader> >(std::unique_ptr<AudioFileReader, std::default_delete<AudioFileReader> > const&, decltype(nullptr))
 
  0.00      7.29    0.00        1    0.00    0.00  std::operator|(std::_Ios_Iostate, std::_Ios_Iostate)
 
  0.00      7.29    0.00        1    0.00    0.00  std::operator|(std::_Ios_Openmode, std::_Ios_Openmode)
 
  
 
=== <span style="color: red">&#x2717;Profile 3: String Processor</span> ===
 
=== <span style="color: red">&#x2717;Profile 3: String Processor</span> ===
Line 665: Line 295:
 
* Sample run:
 
* Sample run:
  
ext_string_example
+
ext_string_example
es + 123 = ext_string123
+
es + 123 = ext_string123
456 + es = 456ext_string
+
456 + es = 456ext_string
es * 3  = ext_stringext_stringext_string
+
es * 3  = ext_stringext_stringext_string
3  * es  = ext_stringext_stringext_string
+
3  * es  = ext_stringext_stringext_string
original:  abc1234?abc1234?abc1234
+
original:  abc1234?abc1234?abc1234
es - abc = 1234?1234?1234
+
es - abc = 1234?1234?1234
es - 123 = abc?abc?abc
+
es - 123 = abc?abc?abc
es -  ? = abc1234abc1234abc1234
+
es -  ? = abc1234abc1234abc1234
ext_string == eXt_StRiNg
+
ext_string == eXt_StRiNg
original:  eXt_StRiNg
+
original:  eXt_StRiNg
lowercase: ext_string
+
lowercase: ext_string
uppercase: EXT_STRING
+
uppercase: EXT_STRING
original:              [  ext_string  ]
+
original:              [  ext_string  ]
remove leading space:  [ext_string  ]
+
remove leading space:  [ext_string  ]
remove trailing space: [ext_string]
+
remove trailing space: [ext_string]
es: abc, ijk, pqr, xyz ---> split: (abc) (ijk) (pqr) (xyz)
+
es: abc, ijk, pqr, xyz ---> split: (abc) (ijk) (pqr) (xyz)
es: abc, ijk, pqr, xyz ---> split_n(3): (abc) (ijk) (pqr)
+
es: abc, ijk, pqr, xyz ---> split_n(3): (abc) (ijk) (pqr)
es: 1, -23, 456, -7890 ---> parse: (1) (-23) (456) (-7890)
+
es: 1, -23, 456, -7890 ---> parse: (1) (-23) (456) (-7890)
es: 1.1, -23.32, 456.654, -7890.0987 ---> parsed: (1.1000000000000001) (-23.32) (456.654) (-7890.0986999999996)
+
es: 1.1, -23.32, 456.654, -7890.0987 ---> parsed: (1.1000000000000001) (-23.32) (456.654) (-7890.0986999999996)
non_repeated_char_example
+
non_repeated_char_example
No non-repeated chars in string.
+
No non-repeated chars in string.
First non repeated char: a
+
First non repeated char: a
First non repeated char: b
+
First non repeated char: b
No non-repeated chars in string.
+
No non-repeated chars in string.
First non repeated char: c
+
First non repeated char: c
First non repeated char: 1
+
First non repeated char: 1
translation_table_example
+
translation_table_example
Before: Such is this simple string sample....Wowzers!
+
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
+
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
+
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
+
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
+
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
+
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
+
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
+
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
+
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
+
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
find_n_consecutive_example
+
find_n_consecutive_example
Result-01: [1] Location: [0]] Length: [1]
+
Result-01: [1] Location: [0]] Length: [1]
Result-02: [22] Location: [2]] Length: [2]
+
Result-02: [22] Location: [2]] Length: [2]
Result-03: [333] Location: [5]] Length: [3]
+
Result-03: [333] Location: [5]] Length: [3]
Result-04: [4444] Location: [9]] Length: [4]
+
Result-04: [4444] Location: [9]] Length: [4]
Result-05: [55555] Location: [14]] Length: [5]
+
Result-05: [55555] Location: [14]] Length: [5]
Result-06: [666666] Location: [20]] Length: [6]
+
Result-06: [666666] Location: [20]] Length: [6]
Result-07: [7777777] Location: [27]] Length: [7]
+
Result-07: [7777777] Location: [27]] Length: [7]
Result-08: [88888888] Location: [35]] Length: [8]
+
Result-08: [88888888] Location: [35]] Length: [8]
Result-09: [999999999] Location: [44]] Length: [9]
+
Result-09: [999999999] Location: [44]] Length: [9]
Result-01: [a] Location: [0]] Length: [1]
+
Result-01: [a] Location: [0]] Length: [1]
Result-02: [bB] Location: [2]] Length: [2]
+
Result-02: [bB] Location: [2]] Length: [2]
Result-03: [cCc] Location: [5]] Length: [3]
+
Result-03: [cCc] Location: [5]] Length: [3]
Result-04: [dDdD] Location: [9]] Length: [4]
+
Result-04: [dDdD] Location: [9]] Length: [4]
Result-05: [EeEeE] Location: [14]] Length: [5]
+
Result-05: [EeEeE] Location: [14]] Length: [5]
Result-06: [fFfFfF] Location: [20]] Length: [6]
+
Result-06: [fFfFfF] Location: [20]] Length: [6]
Result-07: [gGgGgGg] Location: [27]] Length: [7]
+
Result-07: [gGgGgGg] Location: [27]] Length: [7]
Result-08: [HhHhHhHh] Location: [35]] Length: [8]
+
Result-08: [HhHhHhHh] Location: [35]] Length: [8]
Result-09: [IiIiIiIiI] Location: [44]] Length: [9]
+
Result-09: [IiIiIiIiI] Location: [44]] Length: [9]
split_on_consecutive_example
+
split_on_consecutive_example
1 Consecutive digits: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 9 9 0 0 0 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4
+
1 Consecutive digits: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 9 9 0 0 0 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4
2 Consecutive digits: 22 33 44 44 55 55 66 66 66 77 77 77 99 00 11 11 22 22 33 33 33 44 44 44
+
2 Consecutive digits: 22 33 44 44 55 55 66 66 66 77 77 77 99 00 11 11 22 22 33 33 33 44 44 44
3 Consecutive digits: 333 444 555 666 666 777 777 000 111 222 333 333 444 444
+
3 Consecutive digits: 333 444 555 666 666 777 777 000 111 222 333 333 444 444
4 Consecutive digits: 4444 5555 6666 7777 1111 2222 3333 4444
+
4 Consecutive digits: 4444 5555 6666 7777 1111 2222 3333 4444
5 Consecutive digits: 55555 66666 77777 22222 33333 44444
+
5 Consecutive digits: 55555 66666 77777 22222 33333 44444
6 Consecutive digits: 666666 777777 333333 444444
+
6 Consecutive digits: 666666 777777 333333 444444
1 Consecutive letters: A B B C C C D D D D E E E E E F F F F F F G G G G G G G H I I J J J K K K K L L L L L M M M M M M N N N N N N N
+
1 Consecutive letters: A B B C C C D D D D E E E E E F F F F F F G G G G G G G H I I J J J K K K K L L L L L M M M M M M N N N N N N N
2 Consecutive letters: BB CC DD DD EE EE FF FF FF GG GG GG II JJ KK KK LL LL MM MM MM NN NN NN
+
2 Consecutive letters: BB CC DD DD EE EE FF FF FF GG GG GG II JJ KK KK LL LL MM MM MM NN NN NN
3 Consecutive letters: CCC DDD EEE FFF FFF GGG GGG JJJ KKK LLL MMM MMM NNN NNN
+
3 Consecutive letters: CCC DDD EEE FFF FFF GGG GGG JJJ KKK LLL MMM MMM NNN NNN
4 Consecutive letters: DDDD EEEE FFFF GGGG KKKK LLLL MMMM NNNN
+
4 Consecutive letters: DDDD EEEE FFFF GGGG KKKK LLLL MMMM NNNN
5 Consecutive letters: EEEEE FFFFF GGGGG LLLLL MMMMM NNNNN
+
5 Consecutive letters: EEEEE FFFFF GGGGG LLLLL MMMMM NNNNN
6 Consecutive letters: FFFFFF GGGGGG MMMMMM NNNNNN
+
6 Consecutive letters: FFFFFF GGGGGG MMMMMM NNNNNN
index_of_example
+
index_of_example
Index of pattern[0123456789ABC]: 0
+
Index of pattern[0123456789ABC]: 0
Index of pattern[123456789ABC]: 1
+
Index of pattern[123456789ABC]: 1
Index of pattern[23456789ABC]: 2
+
Index of pattern[23456789ABC]: 2
Index of pattern[3456789ABC]: 3
+
Index of pattern[3456789ABC]: 3
Index of pattern[456789ABC]: 4
+
Index of pattern[456789ABC]: 4
Index of pattern[56789ABC]: 5
+
Index of pattern[56789ABC]: 5
Index of pattern[6789ABC]: 6
+
Index of pattern[6789ABC]: 6
Index of pattern[789ABC]: 7
+
Index of pattern[789ABC]: 7
Index of pattern[89ABC]: 8
+
Index of pattern[89ABC]: 8
Index of pattern[9ABC]: 9
+
Index of pattern[9ABC]: 9
Index of pattern[xyz]: 4294967295
+
Index of pattern[xyz]: 4294967295
truncatedint_example
+
truncatedint_example
i = -1234
+
i = -1234
i = -1234
+
i = -1234
u = 1234
+
u = 1234
i = -1234
+
i = -1234
u = 1234
+
u = 1234
  
real    0m0.248s
+
real    0m0.248s
user    0m0.080s
+
user    0m0.080s
sys    0m0.024s
+
sys    0m0.024s
  
 
* Profile:
 
* Profile:
  
  
Flat profile:
+
Flat profile:
 
+
Each sample counts as 0.01 seconds.
Each sample counts as 0.01 seconds.
 
 
   %  cumulative  self              self    total           
 
   %  cumulative  self              self    total           
 
  time  seconds  seconds    calls  ms/call  ms/call  name   
 
  time  seconds  seconds    calls  ms/call  ms/call  name   
Line 773: Line 402:
  
 
== Assignment 2 ==
 
== Assignment 2 ==
 +
 +
==== Description ====
 +
 +
''' Removing CPU Bottleneck '''
 +
 +
Removing the old CPU bottleneck in the <code>byteCipher</code> function:
 +
      for (int i = 0; i < bufferSize; i++){
 +
                // going over every byte in the file
 +
                switch (mode) {
 +
                        case 0: // inversion
 +
                                buffer[i] = ~buffer[i];
 +
                                break;
 +
                        case 1: // cycle
 +
                                buffer [i] = cycle (buffer [i]);
 +
                                break;
 +
                        case 2: // RC4
 +
                                buffer [i] = buffer [i] ^ rc4_output();
 +
                                break;
 +
                }
 +
        }
 +
 +
And replacing it with
 +
...
 +
if (mode == 1)
 +
    getCycleBuffer << < dGrid, dBlock >> >(d_a, bufferSize, d_output);
 +
if (mode == 2)
 +
    getRC4Buffer << < dGrid, dBlock >> >(d_a, bufferSize, d_output);
 +
...
 +
 +
 +
''' Device Functions '''
 +
 +
Converting <code>cycle</code> and <code>rc4_output</code> functions to device functions:
 +
/**
 +
* Description:  Device function cycle
 +
**/
 +
__device__  char cycle(char value) {
 +
  int leftMask = 170;
 +
  int rightMask = 85;
 +
  int iLeft = value & leftMask;
 +
  int iRight = value & rightMask;
 +
  iLeft = iLeft >> 1;
 +
  iRight = iRight << 1;
 +
  return iLeft | iRight;
 +
}
 +
 +
/**
 +
* Description:  Device function RC4
 +
**/
 +
__device__ unsigned char rc4_output() {
 +
  unsigned char temp;
 +
  unsigned char S[0x100]; // dec 256
 +
  unsigned int i, j;
 +
  i = (i + 1) & 0xFF;
 +
  j = (j + S[i]) & 0xFF;
 +
  temp = S[i];
 +
  S[i] = S[j];
 +
  S[j] = temp;
 +
  return S[(S[i] + S[j]) & 0xFF];
 +
}
 +
 +
 +
'''Creating Kernels'''
 +
 +
We created kernels for each of the 2 different methods of Cipher that the program handles (RC4 and Cycle, but not the others -- read on):
 +
/**
 +
* Description:  RC4 Cuda Kernel
 +
**/
 +
__global__ void getRC4Buffer(char * buffer, int bufferSize) {
 +
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
 +
  if (idx < bufferSize)
 +
    buffer[idx] = buffer[idx] ^ rc4_output();
 +
}
 +
 +
/**
 +
* Description:  Cycle Cuda Kernel
 +
**/
 +
__global__ void getCycleBuffer(char * buffer, int bufferSize) {
 +
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
 +
  if (idx < bufferSize)
 +
    buffer[idx] = cycle(buffer[idx]);
 +
}
 +
 +
 +
You may be asking what about the two other methods of cipher: '''byte inversion''' and '''xor cipher'''? Well, as it turns out these methods run perfectly fine on the CPU and usually are faster on the CPU than the GPU. We initially had converted these functions over to CUDA, but we soon discovered that these functions did not need to be converted as they ran faster on the CPU than they did on the GPU.
 +
 +
Here's an example of run time of Xor Cipher on both CPU and GPU with the 789MB file:
 +
 +
GPU: http://i.imgur.com/0PsLxzQ.png -- 6.263 seconds
 +
 +
CPU: http://i.imgur.com/ktn14q3.png -- 3.722 seconds
 +
 +
 +
As we can see, the CPU runs way faster than the GPU: no parallelization needed here!
 +
 +
==== Profiling ====
 +
 +
The following test runs were performed on the following Machine:
 +
* Windows 10
 +
* i7-4790k @ 4.0GHz
 +
* 16GB DDR3
 +
* Nvidia GTX 430
 +
 +
 +
===== RC4 Profiling =====
 +
 +
'''RC4 Cipher - 283 MB mp3 File'''
 +
 +
Total runtime: 1.358 seconds
 +
 +
[[File:music.png]]
 +
 +
 +
'''RC4 Cipher - 636 MB iso File'''
 +
 +
Total runtime: 3.87 seconds
 +
 +
[[File:cent.png]]
 +
 +
 +
'''RC4 Cipher - 789 MB iso File'''
 +
 +
Total runtime: 5.072 seconds
 +
 +
[[File:xu.png]]
 +
 +
 +
''' RC4 Run time comparisons: CPU vs. CUDA '''
 +
 +
Comparing Windows vs. Windows for most accurate results.
 +
 +
[[File:cpuvscuda.png]]
 +
 +
 +
===== Byte Cycle Profiling =====
 +
 +
'''Byte Cycle - 283 MB mp3 File'''
 +
 +
Total runtime: 3.467 seconds
 +
 +
[[File:music2.png]]
 +
 +
 +
'''Byte Cycle - 636 MB iso File'''
 +
 +
Total runtime: 8.088 seconds
 +
 +
[[File:cent2.png]]
 +
 +
 +
'''Byte Cycle - 789 MB iso File'''
 +
 +
Total runtime: 9.472 seconds
 +
 +
[[File:xu2.png]]
 +
 +
 +
''' Byte Cycle time comparisons: CPU vs. CUDA '''
 +
 +
Comparing Windows vs. Windows for most accurate results.
 +
 +
[[File:cpuvscuda2.png]]
 +
 +
==== Conclusion ====
 +
 +
''' RC4 Findings'''
 +
 +
We are seeing about <span style="color: green; font-size:14px">540% (~5.4x)</span> performance increase while using CUDA instead of the CPU in all 3 of the test cases.
 +
 +
 +
''' Byte Cycle Findings'''
 +
 +
We are seeing about <span style="color: green; font-size:14px">320% (~3.2x)</span> performance increase while using CUDA instead of the CPU in all 3 of the test cases.
 +
 +
 +
Overall,  we think that these are amazing results and a significant improvement in performance over the CPU version of the code. Both of these functions have greatly improved in run time and efficiency
 +
 
== Assignment 3 ==
 
== Assignment 3 ==
 +
 +
Due to the nature of the way this program was structured by the original developer, optimization was not really needed. The benefits were very small, but here are the optimized kernels for safe measure:
 +
 +
'''RC4 OPTIMIZED Cuda Kernel'''
 +
<pre>
 +
/**
 +
* Description:  RC4 Cuda Kernel
 +
**/
 +
__global__ void getRC4Buffer(char * buffer, int bufferSize, int ntpb) {
 +
int idx = blockIdx.x * blockDim.x + threadIdx.x;
 +
int tid = threadIdx.x;
 +
 +
__shared__ float sharedMem[_NTPB];
 +
 +
sharedMem[tid] = buffer[idx];
 +
__syncthreads();
 +
 +
if (idx < bufferSize)
 +
sharedMem[tid] = cycle(sharedMem[tid]);
 +
__syncthreads();
 +
 +
buffer[idx] = sharedMem[tid];
 +
}
 +
</pre>
 +
 +
'''Cycle OPTIMIZED Cuda Kernel'''
 +
<pre>
 +
/**
 +
* Description:  Cycle Cuda Kernel
 +
**/
 +
__global__ void getCycleBuffer(char * buffer, int bufferSize) {
 +
int idx = blockIdx.x * blockDim.x + threadIdx.x;
 +
int tid = threadIdx.x;
 +
 +
__shared__ float sharedMem[_NTPB];
 +
 +
sharedMem[tid] = buffer[idx];
 +
__syncthreads();
 +
 +
if (idx < bufferSize)
 +
sharedMem[tid] = cycle(sharedMem[tid]);
 +
__syncthreads();
 +
 +
buffer[idx] = sharedMem[tid];
 +
}
 +
</pre>
 +
 +
The device functions were not modified.
 +
 +
[[File:a3graph.png]]

Latest revision as of 12:57, 8 December 2015

C U D A B O Y S

Team Members

  1. Manjot Sandhu, Some responsibility
  2. Johnathan Ragimov, Some other responsibility
  3. Oleg Eustace, Some other responsibility

Email All

Progress

Assignment 1

✓ Profile 0: File Encryption

Description

This piece of software takes a file and ecrypts it one of 4 ways:

  1. Byte Inversion
  2. Byte Cycle
  3. Xor Cipher
  4. RC4 Cipher


Inside the byteCipher method, exists a for loop that could use optimization. Within this loop specifically, the lines that call the cycle and rc4_output functions are the ones that are taking the longest time to execute:

      for (int i = 0; i < bufferSize; i++){
               // going over every byte in the file
               switch (mode) {
                       case 0: // inversion
                               buffer[i] = ~buffer[i];
                               break;
                       case 1: // cycle
                               buffer [i] = cycle (buffer [i]);
                               break;
                       case 2: // RC4
                               buffer [i] = buffer [i] ^ rc4_output();
                               break;
               }
       }

Here is what these functions cycle and rc4_output functions look like:

char cycle (char value) {
       int leftMask = 170;
       int rightMask = 85;
       int iLeft = value & leftMask;
       int iRight = value & rightMask;
       iLeft = iLeft >> 1;
       iRight = iRight << 1;
       return iLeft | iRight;
}
unsigned char rc4_output() {
   unsigned char temp;
   i = (i + 1) & 0xFF;
   j = (j + S[i]) & 0xFF;
   temp = S[i];
   S[i] = S[j];
   S[j] = temp;
   return S[(S[i] + S[j]) & 0xFF];
}


We need to change these two functions so they are added to the CUDA device as "device functions".

Profiling on Linux

The following test runs were performed on the following Virtual Machine:

  • CentOS 7
  • i7-3820 @ 3.6 GHz
  • 2GB DDR3
  • gcc version 4.8.3


Using compiler settings:

g++ -c -O2 -g -pg -std=c++11 encFile.cpp 


RC4 Cipher - 283 MB mp3 File

[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/music.mp3
/home/johny/aes/music.mp3
* * * File Protector * * *
Mode 4: RC4 cipher
Please enter the RC4 key (8 chars min)
testing123
The password is: testing123
Beginning encryption
Completed: 100%
Cipher completed.
Program terminated.
real    0m6.758s
user    0m3.551s
sys     0m0.068s
Flat profile:
Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
84.05      1.70     1.70 296271519     0.00     0.00  rc4_output()
13.39      1.97     0.27                             byteCipher(int, std::string)
 2.73      2.02     0.06        1    55.09    55.09  rc4_init(unsigned char*, unsigned int)
 0.00      2.02     0.00        1     0.00     0.00  _GLOBAL__sub_I_S

As we can see the rc4_output and byteCipher functions take up most of the processing time.


RC4 Cipher - 636 MB iso File

[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/cent.iso
/home/johny/aes/cent.iso
 * * * File Protector * * *
Mode 4: RC4 cipher
Please enter the RC4 key (8 chars min)
testing123
The password is: testing123
Beginning encryption
Completed: 100%
Cipher completed.
Program terminated.
real    0m10.293s
user    0m8.235s
sys     0m0.312s
Flat profile:
Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
74.86      3.59     3.59 666894336     0.00     0.00  rc4_output()
23.21      4.70     1.11                             byteCipher(int, std::string)
 2.09      4.80     0.10        1   100.16   100.16  rc4_init(unsigned char*, unsigned int)
 0.00      4.80     0.00        1     0.00     0.00  _GLOBAL__sub_I_S

RC4 Cipher - 789 MB iso File

[root@jr-net-cent7 aes]# time ./encFile 4 /home/johny/aes/xu.iso
/home/johny/aes/xu.iso
 * * * File Protector * * *
Mode 4: RC4 cipher
Please enter the RC4 key (8 chars min)
testing123
The password is: testing123
Beginning encryption
Completed: 100%
Cipher completed.
Program terminated.
real    0m12.566s
user    0m10.170s
sys     0m0.228s
Flat profile:
Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
75.51      4.40     4.40 827326464     0.00     0.00  rc4_output()
23.02      5.74     1.34                             byteCipher(int, std::string)
 1.63      5.84     0.10        1    95.15    95.15  rc4_init(unsigned char*, unsigned int)
 0.00      5.84     0.00        1     0.00     0.00  _GLOBAL__sub_I_S


Profiling on Windows

The following test runs were performed on the following Machine:

  • Windows 10
  • i7-4790k @ 4GHz
  • 16GB DDR3
  • Visual Studio 2013


RC4 Cipher - 283 MB mp3 File

Winmp3.png


RC4 Cipher - 636 MB iso File

Wincent.png


RC4 Cipher - 789 MB iso File

Winxu.png


Byte Cycle - 283 MB mp3 File

Winmp32.png


Byte Cycle - 636 MB iso File

Wincent2.png


Byte Cycle - 789 MB iso File

Winxu2.png

✗ Profile 1: PI Approximation

  • Sample run:
[root@jr-net-cent a1]# time ./pi
3.024
operation - took - 0.0001040000 secs
3.1676000000
operation - took - 0.0002280000 secs
3.1422800000
operation - took - 0.0022700000 secs
3.1418720000
operation - took - 0.0222910000 secs
3.1412748000
operation - took - 0.2185140000 secs
3.1417290800
operation - took - 2.2039310000 secs
3.1415420600
operation - took - 21.9592080000 secs
3.1415625844
operation - took - 47.1807910000 secs
3.1415537704
real    3m33.129s 
user    3m32.925s 
sys     0m0.016s
  • gprof:
Each sample counts as 0.01 seconds.
%   cumulative   self              self     total           
time   seconds   seconds    calls   s/call   s/call  name    
100.52    106.93   106.93       11     9.72     9.72  calcpi(int, int*)
0.00    106.93     0.00       11     0.00     0.00  reportTime(char const*, std::chrono::duration<long, std::ratio<1l, 1000000l> >)
0.00    106.93     0.00        1     0.00     0.00  _GLOBAL__sub_I__Z10reportTimePKcNSt6chrono8durationIlSt5ratioILl1ELl1000000EEEE

✗ Profile 2: Wave Form Generator

This is the program we selected to optimize. It's a great candidate because it has 2 primary functions that have a few for loops in them. One of the functions reads an Mp3 file and writes wave data to a file -- this function takes quite a bit of time to execute. The other function actually takes this data and converts it to a view-able sound wave image. Both functions would benefit greatly from the extra processing power that a GPU provides: mp3 read/decode time would be greatly reduced.

'This piece of code is too complex and requires a linux environment to run. Please see Profile 0 for the one we are currently using.'

  • Sample Run
[root@jr-net-cent7 ~]# time audiowaveform -i Steph\ DJ\ -\ Noise\ Control\ Episode\ 025\ Feat\ Jack\ Diamond\ 13th\ January\ 2014.mp3 -o test.dat -z 256 -b 8
Input file: Steph DJ - Noise Control Episode 025 Feat Jack Diamond 13th January 2014.mp3
Format: Audio MPEG layer III stream
Bit rate: 320000 kbit/s
CRC: no
Mode: normal LR stereo
Emphasis: no
Sample rate: 44100 Hz
Generating waveform data...
Samples per pixel: 256
Input channels: 2
Done: 100%
Recoverable frame level error: lost synchronization
Frames decoded: 283540 (123:26.759)
Generated 1275930 points
Writing output file: test.dat
Resolution: 8 bits
real    0m32.486s
user    0m32.409s
sys     0m0.056s
[root@jr-net-cent7 ~]# which audiowaveform
/usr/local/bin/audiowaveform
[root@jr-net-cent7 ~]# gprof -p -b /usr/local/bin/audiowaveform > final.dat


  • gprof
Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls   s/call   s/call  name    
58.71      4.28     4.28    79746     0.00     0.00  WaveformGenerator::process(short const*, int)
31.00      6.54     2.26        1     2.26     7.27  Mp3AudioFileReader::run(AudioProcessor&)
 9.33      7.22     0.68 653276160     0.00     0.00  MadFixedToSshort(int)
 0.41      7.25     0.03        1     0.03     0.03  dumpInfo(std::ostream&, mad_header const&)
 0.14      7.26     0.01  7655603     0.00     0.00  short const& std::forward<short const&>(std::remove_reference<short const&>::type&)
 0.14      7.27     0.01  2551860     0.00     0.00  writeInt8(std::ostream&, signed char)
 0.14      7.28     0.01  2551860     0.00     0.00  std::vector<short, std::allocator<short> >::push_back(short const&)
 0.14      7.29     0.01  1275930     0.00     0.00  WaveformBuffer::getMinSample(int) const
 0.00      7.29     0.00  2551938     0.00     0.00  operator new(unsigned long, void*)
 0.00      7.29     0.00  2551860     0.00     0.00  void __gnu_cxx::new_allocator<short>::construct<short, short const&>(short*, short const&)
 0.00      7.29     0.00  2551860     0.00     0.00  std::vector<short, std::allocator<short> >::operator[](unsigned long) const
 0.00      7.29     0.00  2551860     0.00     0.00  std::enable_if<std::allocator_traits<std::allocator<short> >::__construct_helper<short, short const&>::value, void>::type std::allocator_traits<std::allocator<short> >::_S_construct<short, short const&>(std::allocator<short>&, short*, short const&)
 0.00      7.29     0.00  2551860     0.00     0.00  decltype (_S_construct({parm#1}, {parm#2}, (forward<short const&>)({parm#3}))) std::allocator_traits<std::allocator<short> >::construct<short, short const&>(std::allocator<short>&, short*, short const&)
 0.00      7.29     0.00  1275931     0.00     0.00  WaveformGenerator::reset()
 0.00      7.29     0.00  1275930     0.00     0.00  WaveformBuffer::appendSamples(short, short)
 0.00      7.29     0.00  1275930     0.00     0.00  WaveformBuffer::getMaxSample(int) const
 0.00      7.29     0.00    79747     0.00     0.00  AudioFileReader::showProgress(long long, long long)
 0.00      7.29     0.00     7272     0.00     0.00  BstdRead
 0.00      7.29     0.00     7271     0.00     0.00  BstdFileEofP
.....

✗Profile 3: String Processor

  • Sample run:
ext_string_example
es + 123 = ext_string123
456 + es = 456ext_string
es * 3   = ext_stringext_stringext_string
3  * es  = ext_stringext_stringext_string
original:  abc1234?abc1234?abc1234
es - abc = 1234?1234?1234
es - 123 = abc?abc?abc
es -   ? = abc1234abc1234abc1234
ext_string == eXt_StRiNg
original:  eXt_StRiNg
lowercase: ext_string
uppercase: EXT_STRING
original:              [   ext_string   ]
remove leading space:  [ext_string   ]
remove trailing space: [ext_string]
es: abc, ijk, pqr, xyz ---> split: (abc) (ijk) (pqr) (xyz)
es: abc, ijk, pqr, xyz ---> split_n(3): (abc) (ijk) (pqr)
es: 1, -23, 456, -7890 ---> parse: (1) (-23) (456) (-7890)
es: 1.1, -23.32, 456.654, -7890.0987 ---> parsed: (1.1000000000000001) (-23.32) (456.654) (-7890.0986999999996)
non_repeated_char_example
No non-repeated chars in string.
First non repeated char: a
First non repeated char: b
No non-repeated chars in string.
First non repeated char: c
First non repeated char: 1
translation_table_example
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
Before: Such is this simple string sample....Wowzers!
After: S5ch 3s th3s s3mpl2 str3ng s1mpl2....W4wz2rs!
find_n_consecutive_example
Result-01: [1] Location: [0]] Length: [1]
Result-02: [22] Location: [2]] Length: [2]
Result-03: [333] Location: [5]] Length: [3]
Result-04: [4444] Location: [9]] Length: [4]
Result-05: [55555] Location: [14]] Length: [5]
Result-06: [666666] Location: [20]] Length: [6]
Result-07: [7777777] Location: [27]] Length: [7]
Result-08: [88888888] Location: [35]] Length: [8]
Result-09: [999999999] Location: [44]] Length: [9]
Result-01: [a] Location: [0]] Length: [1]
Result-02: [bB] Location: [2]] Length: [2]
Result-03: [cCc] Location: [5]] Length: [3]
Result-04: [dDdD] Location: [9]] Length: [4]
Result-05: [EeEeE] Location: [14]] Length: [5]
Result-06: [fFfFfF] Location: [20]] Length: [6]
Result-07: [gGgGgGg] Location: [27]] Length: [7]
Result-08: [HhHhHhHh] Location: [35]] Length: [8]
Result-09: [IiIiIiIiI] Location: [44]] Length: [9]
split_on_consecutive_example
1 Consecutive digits: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 9 9 0 0 0 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4
2 Consecutive digits: 22 33 44 44 55 55 66 66 66 77 77 77 99 00 11 11 22 22 33 33 33 44 44 44
3 Consecutive digits: 333 444 555 666 666 777 777 000 111 222 333 333 444 444
4 Consecutive digits: 4444 5555 6666 7777 1111 2222 3333 4444
5 Consecutive digits: 55555 66666 77777 22222 33333 44444
6 Consecutive digits: 666666 777777 333333 444444
1 Consecutive letters: A B B C C C D D D D E E E E E F F F F F F G G G G G G G H I I J J J K K K K L L L L L M M M M M M N N N N N N N
2 Consecutive letters: BB CC DD DD EE EE FF FF FF GG GG GG II JJ KK KK LL LL MM MM MM NN NN NN
3 Consecutive letters: CCC DDD EEE FFF FFF GGG GGG JJJ KKK LLL MMM MMM NNN NNN
4 Consecutive letters: DDDD EEEE FFFF GGGG KKKK LLLL MMMM NNNN
5 Consecutive letters: EEEEE FFFFF GGGGG LLLLL MMMMM NNNNN
6 Consecutive letters: FFFFFF GGGGGG MMMMMM NNNNNN
index_of_example
Index of pattern[0123456789ABC]: 0
Index of pattern[123456789ABC]: 1
Index of pattern[23456789ABC]: 2
Index of pattern[3456789ABC]: 3
Index of pattern[456789ABC]: 4
Index of pattern[56789ABC]: 5
Index of pattern[6789ABC]: 6
Index of pattern[789ABC]: 7
Index of pattern[89ABC]: 8
Index of pattern[9ABC]: 9
Index of pattern[xyz]: 4294967295
truncatedint_example
i = -1234
i = -1234
u = 1234
i = -1234
u = 1234
real    0m0.248s
user    0m0.080s
sys     0m0.024s
  • Profile:


Flat profile:
Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total          
time   seconds   seconds    calls  ms/call  ms/call  name   
83.33      0.05     0.05  1000008     0.00     0.00  unsigned int boost::uniform_int<unsigned int>::generate<boost::random::detail::pass_through_engine<boost::random::detail::pass_through_engine<boost::random::mersenne_twister<unsigned int, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18, 3346425566u>&> > >(boost::random::detail::pass_through_engine<boost::random::detail::pass_through_engine<boost::random::mersenne_twister<unsigned int, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18, 3346425566u>&> >&, unsigned int, unsigned int, unsigned int)
16.67      0.06     0.01        1    10.00    60.00  strtk::generate_random_data(unsigned char*, unsigned int, unsigned int, unsigned int)
 0.00      0.06     0.00     1642     0.00     0.00  boost::random::mersenne_twister<unsigned int, 32, 624, 397, 31, 2567483615u, 11, 7, 2636928640u, 15, 4022730752u, 18, 3346425566u>::twist(int)
 0.00      0.06     0.00      979     0.00     0.00  strtk::text::is_digit(char)
 0.00      0.06     0.00      978     0.00     0.00  strtk::text::is_letter(char)

Assignment 2

Description

Removing CPU Bottleneck

Removing the old CPU bottleneck in the byteCipher function:

      for (int i = 0; i < bufferSize; i++){
               // going over every byte in the file
               switch (mode) {
                       case 0: // inversion
                               buffer[i] = ~buffer[i];
                               break;
                       case 1: // cycle
                               buffer [i] = cycle (buffer [i]);
                               break;
                       case 2: // RC4
                               buffer [i] = buffer [i] ^ rc4_output();
                               break;
               }
       }

And replacing it with

...
if (mode == 1)
   getCycleBuffer << < dGrid, dBlock >> >(d_a, bufferSize, d_output);
if (mode == 2)
   getRC4Buffer << < dGrid, dBlock >> >(d_a, bufferSize, d_output);
...


Device Functions

Converting cycle and rc4_output functions to device functions:

/**
* Description:  Device function cycle
**/
__device__  char cycle(char value) {
  int leftMask = 170;
  int rightMask = 85;
  int iLeft = value & leftMask;
  int iRight = value & rightMask;
  iLeft = iLeft >> 1;
  iRight = iRight << 1;
  return iLeft | iRight;
}
/**
* Description:  Device function RC4
**/
__device__ unsigned char rc4_output() {
  unsigned char temp;
  unsigned char S[0x100]; // dec 256
  unsigned int i, j;
  i = (i + 1) & 0xFF;
  j = (j + S[i]) & 0xFF;
  temp = S[i];
  S[i] = S[j];
  S[j] = temp;
  return S[(S[i] + S[j]) & 0xFF];
}


Creating Kernels

We created kernels for each of the 2 different methods of Cipher that the program handles (RC4 and Cycle, but not the others -- read on):

/**
* Description:  RC4 Cuda Kernel
**/
__global__ void getRC4Buffer(char * buffer, int bufferSize) {
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  if (idx < bufferSize)
    buffer[idx] = buffer[idx] ^ rc4_output();
}
/**
* Description:  Cycle Cuda Kernel
**/
__global__ void getCycleBuffer(char * buffer, int bufferSize) {
 int idx = blockIdx.x * blockDim.x + threadIdx.x;
 if (idx < bufferSize)
   buffer[idx] = cycle(buffer[idx]);
}


You may be asking what about the two other methods of cipher: byte inversion and xor cipher? Well, as it turns out these methods run perfectly fine on the CPU and usually are faster on the CPU than the GPU. We initially had converted these functions over to CUDA, but we soon discovered that these functions did not need to be converted as they ran faster on the CPU than they did on the GPU.

Here's an example of run time of Xor Cipher on both CPU and GPU with the 789MB file:

GPU: http://i.imgur.com/0PsLxzQ.png -- 6.263 seconds

CPU: http://i.imgur.com/ktn14q3.png -- 3.722 seconds


As we can see, the CPU runs way faster than the GPU: no parallelization needed here!

Profiling

The following test runs were performed on the following Machine:

  • Windows 10
  • i7-4790k @ 4.0GHz
  • 16GB DDR3
  • Nvidia GTX 430


RC4 Profiling

RC4 Cipher - 283 MB mp3 File

Total runtime: 1.358 seconds

Music.png


RC4 Cipher - 636 MB iso File

Total runtime: 3.87 seconds

Cent.png


RC4 Cipher - 789 MB iso File

Total runtime: 5.072 seconds

Xu.png


RC4 Run time comparisons: CPU vs. CUDA

Comparing Windows vs. Windows for most accurate results.

Cpuvscuda.png


Byte Cycle Profiling

Byte Cycle - 283 MB mp3 File

Total runtime: 3.467 seconds

Music2.png


Byte Cycle - 636 MB iso File

Total runtime: 8.088 seconds

Cent2.png


Byte Cycle - 789 MB iso File

Total runtime: 9.472 seconds

Xu2.png


Byte Cycle time comparisons: CPU vs. CUDA

Comparing Windows vs. Windows for most accurate results.

Cpuvscuda2.png

Conclusion

RC4 Findings

We are seeing about 540% (~5.4x) performance increase while using CUDA instead of the CPU in all 3 of the test cases.


Byte Cycle Findings

We are seeing about 320% (~3.2x) performance increase while using CUDA instead of the CPU in all 3 of the test cases.


Overall, we think that these are amazing results and a significant improvement in performance over the CPU version of the code. Both of these functions have greatly improved in run time and efficiency

Assignment 3

Due to the nature of the way this program was structured by the original developer, optimization was not really needed. The benefits were very small, but here are the optimized kernels for safe measure:

RC4 OPTIMIZED Cuda Kernel

 /**
 * Description:  RC4 Cuda Kernel
 **/
__global__ void getRC4Buffer(char * buffer, int bufferSize, int ntpb) {	
	int idx = blockIdx.x * blockDim.x + threadIdx.x;
	int tid = threadIdx.x;

	__shared__ float sharedMem[_NTPB];

	sharedMem[tid] = buffer[idx];
	__syncthreads();

	if (idx < bufferSize)
		sharedMem[tid] = cycle(sharedMem[tid]);
	__syncthreads();

	buffer[idx] = sharedMem[tid];
}

Cycle OPTIMIZED Cuda Kernel

/**
* Description:  Cycle Cuda Kernel
**/
__global__ void getCycleBuffer(char * buffer, int bufferSize) {
	int idx = blockIdx.x * blockDim.x + threadIdx.x;
	int tid = threadIdx.x;

	__shared__ float sharedMem[_NTPB];

	sharedMem[tid] = buffer[idx];
	__syncthreads();

	if (idx < bufferSize)
		sharedMem[tid] = cycle(sharedMem[tid]);
	__syncthreads();

	buffer[idx] = sharedMem[tid];
}

The device functions were not modified.

A3graph.png