-
Notifications
You must be signed in to change notification settings - Fork 5
/
README.txt
529 lines (429 loc) · 23.7 KB
/
README.txt
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
/***********************************************************************
* __________________________________________________________________
*
* _____ _ ____ _ __
* / ___/(_)___ ___ / __ \____ (_)___ / /_
* \__ \/ / __ `__ \/ /_/ / __ \/ / __ \/ __/
* ___/ / / / / / / / ____/ /_/ / / / / / /_
* /____/_/_/ /_/ /_/_/ \____/_/_/ /_/\__/
*
* __________________________________________________________________
*
* This file is part of the SimPoint Toolkit written by Greg Hamerly,
* Erez Perelman, Jeremy Lau, Tim Sherwood, and Brad Calder as part of
* Efficient Simulation Project at UCSD. If you find this toolkit useful please
* cite the following paper published at ASPLOS 2002.
*
* Timothy Sherwood, Erez Perelman, Greg Hamerly and Brad Calder,
* Automatically Characterizing Large Scale Program Behavior , In the
* 10th International Conference on Architectural Support for Programming
* Languages and Operating Systems, October 2002.
*
* Contact info:
* Brad Calder <calder@cs.ucsd.edu>, (858) 822 - 1619
* Greg Hamerly <Greg_Hamerly@baylor.edu>,
* Erez Perelman <eperelma@cs.ucsd.edu>,
* Jeremy Lau <jl@cs.ucsd.edu>,
* Tim Sherwood <sherwood@cs.ucsb.edu>
*
* University of California, San Diego
* Department of Computer Science and Engineering
* 9500 Gilman Drive, Dept 0114
* La Jolla CA 92093-0114 USA
*
*
* Copyright 2001, 2002, 2003, 2004, 2005 The Regents of the University of
* California All Rights Reserved
*
* Permission to use, copy, modify and distribute any part of this
* SimPoint Toolkit for educational, non-profit, and industry research
* purposes, without fee, and without a written agreement is hereby
* granted, provided that the above copyright notice, this paragraph and
* the following four paragraphs appear in all copies and every modified
* file.
*
* Permission is not granted to include SimPoint into a commercial product.
* Those desiring to incorporate this SimPoint Toolkit into commercial
* products should contact the Technology Transfer Office, University of
* California, San Diego, 9500 Gilman Drive, La Jolla, CA 92093-0910, Ph:
* (619) 534-5815, FAX: (619) 534-7345.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
* INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THE SimPoint
* Toolkit, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* THE SimPoint Toolkit PROVIDED HEREIN IS ON AN "AS IS" BASIS, AND THE
* UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. THE UNIVERSITY OF
* CALIFORNIA MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES OF ANY
* KIND, EITHER IMPLIED OR EXPRESS, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
* PURPOSE, OR THAT THE USE OF THE SimPoint Toolkit WILL NOT INFRINGE ANY
* PATENT, TRADEMARK OR OTHER RIGHTS.
*
* No non-profit user may place any restrictions on the use of this
* software, including as modified by the user, by any other authorized
* user.
*
************************************************************************/
I. ABOUT SIMPOINT
SimPoint is a simulation analysis tool designed to find the ideal
simulation points in applications. It provides the user with relevant
information regarding the execution behavior of the application,
including an accurate length of the initialization phase.
To make SimPoint a fast and efficient tool, its analysis does not use
any knowledge of the architectural metrics for the program (which
consume a great deal of processing power and time to collect), but
instead utilizes a modeling schema that highly correlates with the
performance of those metrics.
The SimPoint analysis has two main steps. The first step consists of
running a program for an input and recording for each interval of
execution a frequency vector to represent that interval's execution.
The second step analyzes the frequency vector profile and returns the
ideal simulation point, and the duration of initialization phase.
This package includes the software for this second step (the frequency
vector analyzer to find multiple simulation points). Please see the
following website for packages to generate one form of frequency
vectors called basic block profiles:
http://www-cse.ucsd.edu/~calder/simpoint/
---------------------------------------------------------------------
II. HOW TO USE the SimPoint Toolkit for Simulation
(A) Create a frequency vector profile (e.g. here we will use a basic
block profile, a .bb file) for the program you are interested in
finding simulation points for. You can either using one of our
BBTracker tools, or form your own frequency vector file. The format of
the frequency vector file is described below. Choosing the interval
length for the frequency vector file is important, since this is
assumed to be the length of a single simulation point in the rest of
the analysis below. For example, if you set the interval length to be
10 million, then each simulation point is calculated assuming you will
simulate each point for 10 million instructions.
(B) usage: Run "simpoint" (as described below) on the frequency vector
file. This will create the following two files -- .simpoints and
.weights files. Each simulation point in the .simpoints file is in
terms of the number of intervals from the *start* of execution to
reach the start of the simulation point. The weights are in terms of
the percentage of intervals of excution being represented by each
simulation point.
(C) Now that you have the simulation points, you can simulate each
program for N million instructions at each point in the .simpoints
file, where N million is the interval length. After simulating each
point, you combine all of the results to get an overall program result
using the weights in the .weights file.
---------------------------------------------------------------------
III. SETUP
In this directory you should find the following subdirectories and files:
README.txt - this file
input/ - contains a sample input file
output/ - the default directory for storing output and working files
analysiscode/ - where the C++ code is stored that performs the analysis
bin/ - contains simpoint executable
---------------------------------------------------------------------
IV. BUILDING
Usage: there are three sub commands for the Makefile in this directory:
make simpoint - builds the SimPoint program to perform the clustering aanalysis
make all - generates the SimPoint program and runs it on the sample input
make clean - clean everything up
The simpoint binary is copied into the bin directory.
---------------------------------------------------------------------
V. FREQUENCY VECTOR FILE FORMAT (USING BASIC BLOCK VECTOR AS AN EXAMPLE)
Running SimPoint requires the frequency vector execution history of
the program and the desired simulation duration. Here we describe the
file format in terms of basic block vectors, but any frequency vectors
can be used as long as they use the same format. An example .bb file
can be found in the input directory. The basic blocks can be profiled
using the ATOM binary instrumentation tool or simplescalar using other
packages contained within this distribution. The profiler then
outputs for each interval of instructions (e.g., every 10 millions) a
basic block vector representing the number of times each basic block
was executed during that interval.
The number of intervals, or the number of instructions per interval can be
set to any value and the analysis should handle it cleanly. Read more
about how basic block profiles are generated in the profile generation
packages, in this file we only concern ourselves with the format of the
file.
The basic block profiler should output a .bb file with the following
format:
T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
...
...
...
T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
T:BB_X:TimesExecuted :BB_Y:TimesExecuted ... :BB_Z:TimesExecuted
Each line represents an execution interval of interval-size
instructions executed and each line starts with the literal "T". The
file then contains a representation of a sparse vector as a list of
dimension,value pairs all separated by colons. Each element has two
fields:
1) BB_X - Represents a particular basic block with a basic block
identification number. Each basic block in the program is
represented with its own unique basic block identification number.
The numbering starts at 1, and represents each dimension in the vector.
2) TimesExecuted - The number of times a basic block has executed
in that execution interval. This is the basic block size (number
of instructions in the basic block) times the number of times
the basic block was executed. If a basic block has not executed at
all during an interval, than it does not have an entry for that
interval. Hence, each line will only correspond to the basic
blocks executed in a particular interval, usually a sparse
matrix.
---------------------------------------------------------------------
VI. USAGE Examples
To run SimPoint for computing up to a maximum of 30 simulation points
using binary search for a single seed initialization for each clustering:
Command-line: "simpoint -maxK 30 -numInitSeeds 1 -loadFVFile gcc-00-166-ref"
Using these options (*** indicates user-specified option):
*** -loadFVFile : gcc-00-166-ref
-k : search
-iters : 100
-dim : 15
*** -maxK : 30
*** -numInitSeeds : 1
-coveragePct : 1
-bicThreshold : 0.9
-saveAll : false
-initkm : samp
-saveLabels :
-saveSimpoints :
-saveSimpointWeights :
-saveVectorWeights :
-saveInitCtrs :
-saveFinalCtrs :
-saveVectorsTxtFmt :
-saveVectorsBinFmt :
-saveProjMatrixTxtFmt :
-saveProjMatrixBinFmt :
-loadVectorsTxtFmt :
-loadVectorsBinFmt :
-loadProjMatrixTxtFmt :
-loadProjMatrixBinFmt :
-loadInitCtrs :
-loadInitLabels :
-loadVectorWeights :
-inputVectorsGzipped : false
-fixedLength : on
-numFVs : -1
-FVDim : -1
-sampleSize : -1
-seedkm : 493575226
-seedproj : 2042712918
-seedsample : 385089224
-verbose : 0
-------------------------------------------------------------
Loading data from frequency vector file 'gcc-00-166-ref' (size: 4692x102038)
Created random projection matrix (size: 102038x15)
Loaded and projected frequency vector file
Applying fixed-length vector weights (uniform weights)
Searching for best clustering for k <= 30
--------------------------------------------------------------
Run number 1 of at most 7, k = 1
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575226
--------------------------------------------------------------
Initialized k-means centers using random sampling: 1 centers
Number of k-means iterations performed: 2
BIC score: -13200.2
Distortion: 5984.8
Distortions/cluster: 5984.8
Variance: 1.27581
Variances/cluster: 1.27581
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 2 of at most 7, k = 30
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575227
--------------------------------------------------------------
Initialized k-means centers using random sampling: 30 centers
Number of k-means iterations performed: 44
BIC score: 108582
Distortion: 119.247
Distortions/cluster: 9.69634 0.166872 1.3202 1.08809 0.0199032 0.109839 0.0750441 70.8016 1.31071 0.049063 0.157854 0.0486661 0.639056 0.00212212 29.4244 0.386966 0.0185713 0.591622 1.1625 0.00201696 0.0214016 0.302739 0.0924497 0.123345 0.00361603 0.185912 0.0347233 0.047781 0.305531 1.05757
Variance: 0.0255784
Variances/cluster: 0.0157664 0.00179433 0.0338514 0.0181348 0.0016586 0.000653804 0.000261478 0.13039 0.00642504 0.000402156 0.00751684 0.000182955 0.00213731 1.02025e-05 0.498719 0.00135303 0.000157384 0.0986037 0.0207589 1.7239e-05 0.0107008 0.0216242 0.000783472 0.00587358 2.80312e-05 0.00338022 0.00024453 0.000645689 0.000883037 0.00581085
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 3 of at most 7, k = 15
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575228
--------------------------------------------------------------
Initialized k-means centers using random sampling: 15 centers
Number of k-means iterations performed: 25
BIC score: 91980.9
Distortion: 213.081
Distortions/cluster: 0.174846 0.361241 84.9402 0.123516 0.238624 0.0199032 8.85981 0.114226 0.361188 23.9325 45.801 0.0948807 0.0896272 40.5783 7.39123
Variance: 0.0455593
Variances/cluster: 0.0102851 0.00138939 0.148757 0.000376573 0.00195593 0.0016586 0.00943537 0.000664104 0.00220237 0.0350916 0.206311 0.000296502 0.00029386 0.414065 0.0158951
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 4 of at most 7, k = 22
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575229
--------------------------------------------------------------
Initialized k-means centers using random sampling: 22 centers
Number of k-means iterations performed: 29
BIC score: 98820.8
Distortion: 165.752
Distortions/cluster: 5.26562 0.0928175 1.05757 0.00201696 4.03812 0.00212212 0.735767 0.134562 0.591622 0.0857724 0.0909795 0.404499 0.264384 0.320546 0.422794 0.0214016 87.8089 30.9343 10.1335 0.106345 0.0814339 23.157
Variance: 0.0354929
Variances/cluster: 0.0516238 0.000909975 0.00581085 1.7239e-05 0.0593842 1.02025e-05 0.00399874 0.00213591 0.0986037 0.00038463 0.000433236 0.00163765 0.00179853 0.000638538 0.0248702 0.0107008 0.169515 0.0448974 0.0164505 0.000770617 0.000329692 0.282402
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 5 of at most 7, k = 18
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575230
--------------------------------------------------------------
Initialized k-means centers using random sampling: 18 centers
Number of k-means iterations performed: 23
BIC score: 82019.4
Distortion: 273.225
Distortions/cluster: 0.0199032 0.409534 9.66287 1.05757 4.5632 29.4244 1.36881 220.53 0.200089 0.0620945 0.0183801 0.0258969 0.735234 0.0358411 0.0453976 4.67245 0.361241 0.0322296
Variance: 0.0584564
Variances/cluster: 0.0016586 0.00116345 0.0157376 0.00581085 0.0518545 0.498719 0.00712919 0.26506 0.00256524 0.00055941 0.000154455 0.000119893 0.00186608 0.000218543 0.000138831 0.0104999 0.00138939 0.000140741
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 6 of at most 7, k = 20
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575231
--------------------------------------------------------------
Initialized k-means centers using random sampling: 20 centers
Number of k-means iterations performed: 47
BIC score: 58135.3
Distortion: 533.34
Distortions/cluster: 0.703321 0.591622 0.0909795 0.244175 0.171466 1.99354 0.529482 0.690324 3.16467 0.28337 0.0928175 0.0857724 0.0814339 1.49732 5.10592 517.724 0.0214016 0.00201696 0.00212212 0.264384
Variance: 0.114157
Variances/cluster: 0.00651223 0.0986037 0.000433236 0.000552433 0.000672415 0.00615291 0.00161921 0.00420929 0.03907 0.00120072 0.000909975 0.00038463 0.000329692 0.0139937 0.0173082 0.483403 0.0107008 1.7239e-05 1.02025e-05 0.00179853
The best initialization seed trial was #1
--------------------------------------------------------------
Run number 7 of at most 7, k = 21
--------------------------------------------------------------
--------------------------------------------------------------
Initialization seed trial #1 of 1; initialization seed = 493575232
--------------------------------------------------------------
Initialized k-means centers using random sampling: 21 centers
Number of k-means iterations performed: 19
BIC score: 92405
Distortion: 197.018
Distortions/cluster: 11.7644 18.7937 0.361241 1.35609 106.485 0.369643 2.03601 0.224835 0.232503 0.273034 1.05757 0.348164 1.59714 3.27793 0.199759 0.809744 0.65763 0.0199032 0.752715 0.0453976 46.3562
Variance: 0.0421791
Variances/cluster: 0.158978 0.507939 0.00138939 0.00721326 0.190833 0.00165019 0.0169668 0.00270886 0.000504344 0.00128789 0.00581085 0.00105504 0.0371429 0.00764087 0.000850037 0.00192796 0.00332136 0.0016586 0.0136857 0.000138831 0.207875
The best initialization seed trial was #1
------------------------------------------------------------------
------------------------------------------------------------------
Post-processing runs
------------------------------------------------------------------
------------------------------------------------------------------
For the BIC threshold, the best clustering was run 4 (k = 22)
Post-processing run 4 (k = 22)
**************************************************************************
To run SimPoint for computing up to a maximum of 30 simulation points,
and search thru every value of k:
% simpoint -k 1:30 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for computing up to a maximum of 30 simulation points,
and search thru every other value of k:
% simpoint -k 2:2:30 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint thru a specific set values for k:
% simpoint -k 1,4,5,10,25,30 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for a known number of simulation points, the -k option
can be used (e.g. for 30 simulation points):
% simpoint -k 30 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for computing up to a maximum of 30 simulation points,
using binary search:
% simpoint -maxK 30 -loadFVFile gcc-00-166-ref.bb
or
% simpoint -maxK 30 -k search -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for computing up to a maximum of 30 simulation points
and saving essential files as 'simpoints' and 'weights'.
% simpoint -maxK 30 -saveSimpoints simpoints -saveSimpointWeights weights -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for finding simulation points that cover a percentage
(e.g. 90%) of the execution:
% simpoint -maxK 30 -coveragePct .9 -saveSimpoints simpoints
-saveSimpointWeights weights -loadFVFile gcc-00-166-ref.bb
100% Coverage 90% Coverage
simpoints weights simpoints weights
1885 0 0.0390026 0 2613 1 0.0867155 1
2613 1 0.0833333 1 4469 2 0.157463 2
4469 2 0.151321 2 661 3 0.121978 3
661 3 0.117221 3 1781 4 0.155689 4
1781 4 0.149616 4 1159 5 0.0869372 5
1159 5 0.0835465 5 30 6 0.197827 6
30 6 0.190111 6 1341 7 0.120648 7
1341 7 0.115942 7 2403 8 0.0727434 8
2403 8 0.0699062 8
**************************************************************************
To run SimPoint and sample the frequency vector to use up to a max of
10,000 intervals
% simpoint -maxK 30 -sampleSize 10000 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for a specified number of seeds (e.g. for only 1 seed
at each value of k):
% simpoint -maxK 30 -numInitSeeds 1 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint and initialize k-means centers with furthest-first
algorithm:
% simpoint -maxK 30 -initkm ff -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for finding a clustering for a specified BIC relative
score (80% of best score, instead of 90%):
% simpoint -maxK 30 -bicThreshold .8 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint for finding simulation points that cover a percentage
(e.g. 90%) of the execution:
% simpoint -maxK 30 -reportLargestPct .9 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint and save the projected data of the frequency vectors:
% simpoint -maxK 30 -saveProjData projData -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint loading projected data (Note, 'fixedLength' option
must be specified with this option):
% simpoint -maxK 30 -loadProjData projData -fixedLength on
**************************************************************************
To run SimPoint on variable length intervals:
% simpoint -maxK 30 -fixedLength off -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint and sample the frequency vector to use up to a max of
100,000 intervals
**************************************************************************
% simpoint -maxK 30 -sampleSize 100000 -loadFVFile gcc-00-166-ref.bb
**************************************************************************
To run SimPoint and save all simulation points searched thru
% simpoint -maxK 30 -saveAll -saveSimpoints simpoints -loadFVFile gcc-00-166-ref.bb
---------------------------------------------------------------------
VII. HOW IT WORKS
In order to do a clustering with K-means, you need to know how many
clusters to start with. An in depth description can be found in:
Greg Hamerly, Erez Perelman, Jeremy Lau, and Brad Calder,
SimPoint 3.0: Faster and More Flexible Program Analysis , Workshop on
Modeling, Benchmarking and Simulation, June 2005
and
Timothy Sherwood, Erez Perelman, Greg Hamerly and Brad Calder.
Automatically Characterizing Large Scale Program Behavior, In the
proceedings of the Tenth International Conference on Architectural Support
for Programming Languages and Operating Systems (ASPLOS 2002), October
2002. San Jose, California
---------------------------------------------------------------------
VIII. RELEASE NOTES
Wed Feb 1 11:44:41 PST 2006 (release 3.2)
- fixed compile bug on 64 bit machines (i.e. AMD64 and PPC/OSX)
- unrolled inner k-means loop for added performance
- added our own random number generator (in Utilities.h), so we get
consistent random numbers across platforms
- removed some old code in Datapoint/Dataset classes that are not
currently being used (e.g. computing early indexes)
- fixed bug in k-means that would give incorrect answer when 0 iterations
were chosen