1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
/***************************************************************************
* tools/benchmarks/tpie_stack_benchmark.cpp
*
* Part of the STXXL. See http://stxxl.sourceforge.net
*
* Copyright (C) 2006 Roman Dementiev <dementiev@ira.uka.de>
*
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
**************************************************************************/
//! \example containers/tpie_stack_benchmark.cpp
//! This is a benchmark mentioned in the paper
//! R. Dementiev, L. Kettner, P. Sanders "STXXL: standard template library for XXL data sets"
//! Software: Practice and Experience
//! Volume 38, Issue 6, Pages 589-637, May 2008
//! DOI: 10.1002/spe.844
#include "app_config.h"
#include <portability.h>
#include <versions.h>
// Get the AMI_stack definition.
#include <ami_stack.h>
// Utilities for ASCII output.
#include <ami_scan_utils.h>
#include <stxxl/bits/common/utils.h>
#include <stxxl/bits/verbose.h>
#include <stxxl/timer>
#define MEM_2_RESERVE (768 * 1024 * 1024)
#define BLOCK_SIZE (2 * 1024 * 1024)
#ifndef DISKS
#define DISKS 1
#endif
template <unsigned RECORD_SIZE>
struct my_record_
{
char data[RECORD_SIZE];
my_record_() { }
};
template <class my_record>
void run_stack(stxxl::int64 volume)
{
typedef AMI_stack<my_record> stack_type;
MM_manager.set_memory_limit(BLOCK_SIZE * DISKS * 8);
STXXL_MSG("Record size: " << sizeof(my_record) << " bytes");
stack_type Stack;
stxxl::int64 ops = volume / sizeof(my_record);
stxxl::int64 i;
my_record cur;
stxxl::timer Timer;
Timer.start();
for (i = 0; i < ops; ++i)
{
Stack.push(cur);
}
Timer.stop();
STXXL_MSG("Records in Stack: " << Stack.stream_len());
if (i != Stack.stream_len())
{
STXXL_MSG("Size does not match");
abort();
}
STXXL_MSG("Insertions elapsed time: " << (Timer.mseconds() / 1000.) <<
" seconds : " << (double(volume) / (1024. * 1024. * Timer.mseconds() / 1000.)) <<
" MiB/s");
////////////////////////////////////////////////
Timer.reset();
Timer.start();
my_record* out;
for (i = 0; i < ops; ++i)
{
Stack.pop(&out);
}
Timer.stop();
STXXL_MSG("Records in Stack: " << Stack.stream_len());
if (Stack.stream_len() != 0)
{
STXXL_MSG("Stack must be empty");
abort();
}
STXXL_MSG("Deletions elapsed time: " << (Timer.mseconds() / 1000.) <<
" seconds : " << (double(volume) / (1024. * 1024. * Timer.mseconds() / 1000.)) <<
" MiB/s");
}
int main(int argc, char* argv[])
{
using std::cout;
using std::endl;
#ifdef BTE_COLLECTION_IMP_MMAP
cout << "BTE_COLLECTION_IMP_MMAP is defined" << endl;
#endif
#ifdef BTE_COLLECTION_IMP_UFS
cout << "BTE_COLLECTION_IMP_UFS is defined" << endl;
#endif
#ifdef BTE_STREAM_IMP_UFS
cout << "BTE_STREAM_IMP_UFS is defined" << endl;
cout << "BTE_STREAM_UFS_BLOCK_FACTOR is " << BTE_STREAM_UFS_BLOCK_FACTOR << endl;
cout << "Actual block size is " << (TPIE_OS_BLOCKSIZE() * BTE_STREAM_UFS_BLOCK_FACTOR / 1024) << " KiB" << endl;
#endif
#ifdef BTE_STREAM_IMP_MMAP
cout << "BTE_STREAM_IMP_MMAP is defined" << endl;
cout << "BTE_STREAM_MMAP_BLOCK_FACTOR is " << BTE_STREAM_MMAP_BLOCK_FACTOR << endl;
cout << "Actual block size is " << (TPIE_OS_BLOCKSIZE() * BTE_STREAM_MMAP_BLOCK_FACTOR / 1024) << " KiB" << endl;
#endif
#ifdef BTE_STREAM_IMP_STDIO
cout << "BTE_STREAM_IMP_STDIO is defined" << endl;
#endif
cout << "TPIE_OS_BLOCKSIZE() is " << TPIE_OS_BLOCKSIZE() << endl;
if (argc < 3)
{
STXXL_MSG("Usage: " << argv[0] << " version #volume");
STXXL_MSG("\t version = 1: TPIE stack with 4 byte records");
STXXL_MSG("\t version = 2: TPIE stack with 32 byte records");
return -1;
}
int version = atoi(argv[1]);
stxxl::int64 volume = stxxl::atoint64(argv[2]);
STXXL_MSG("Allocating array with size " << MEM_2_RESERVE
<< " bytes to prevent file buffering.");
//int * array = new int[MEM_2_RESERVE/sizeof(int)];
int* array = (int*)malloc(MEM_2_RESERVE);
std::fill(array, array + (MEM_2_RESERVE / sizeof(int)), 0);
STXXL_MSG("Running version: " << version);
STXXL_MSG("Data volume : " << volume << " bytes");
switch (version)
{
case 1:
run_stack<my_record_<4> >(volume);
break;
case 2:
run_stack<my_record_<32> >(volume);
break;
default:
STXXL_MSG("Unsupported version " << version);
}
//delete [] array;
free(array);
}
|