... | ... | @@ -5,7 +5,7 @@ Back to the [GarbageCollectorNotes](garbage-collector-notes) |
|
|
|
|
|
|
|
|
The essential idea is best described here:
|
|
|
[ Parallel Garbage Collection for Shared Memory Multiprocessors (2001)](http://citeseer.ist.psu.edu/flood01parallel.html)
|
|
|
[Parallel Garbage Collection for Shared Memory Multiprocessors (2001)](http://citeseer.ist.psu.edu/flood01parallel.html)
|
|
|
|
|
|
|
|
|
It is helpful to be aware of copy collection and mark-compact collection before you read the above paper. The Richard Jones and Raphael Lins text on Garbage Collection is a recommended resource.
|
... | ... | @@ -21,7 +21,7 @@ Here are some plots of block distance against the collection number and the aver |
|
|
|
|
|
The essential idea behind work stealing is that free threads can steal work from busy threads. The work is essentially the work of scavenging live objects. hp_bd points to the top of the to-space where the next free object can go. scan_bd points to the block where the next object to be scanned is. All objects between scan_bd and hp_bd are objects that are yet to be scanned. A free thread essentially steal a block of objects in this range and can scan them, essentially reducing the load of the busy thread.
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames//HaskellGC/ds/st-scanning-3.jpg](http://www.cs.indiana.edu/~rpjames//HaskellGC/ds/st-scanning-3.jpg)
|
|
|
[http://www.cs.indiana.edu/\~rpjames//HaskellGC/ds/st-scanning-3.jpg](http://www.cs.indiana.edu/~rpjames//HaskellGC/ds/st-scanning-3.jpg)
|
|
|
|
|
|
|
|
|
The following program was used to generate some the graphs below. Changing the treeDepth and the nTrees values below one can get the program to have different memory profiles.
|
... | ... | @@ -60,9 +60,9 @@ recVal (x:xs) = treeVal x xs |
|
|
|
|
|
Here are some plots:
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-live_objs-time.png)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-live_objs-time.png)
|
|
|
|
|
|
|
|
|
Here is how to interpret the graphs. The label ‘\#’ on an axis indicates that it is time where each tick is a garbage collection. The label ‘live_objs’ indicates the total number of live objects encountered during this collection. This is not the total number of live objects in the system but only those in the generations currently collected. The value ‘block_dist’ indicates the maximum block distance encountered during a collection.
|
... | ... | @@ -76,21 +76,21 @@ Here are similar plots of some programs in the nofib test suite that is availabl |
|
|
|
|
|
Plots of real/fulsom (with input 8)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-live_objs-time.png)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-live_objs-time.png)
|
|
|
|
|
|
|
|
|
Plots of real/pic (with input 20000)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-live_objs-time.png)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-live_objs-time.png)
|
|
|
|
|
|
|
|
|
Plots of real/fem (with fem.stdin)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-block_dist-time.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-live_objs-time.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-block_dist-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-block_dist-time.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-live_objs-time.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-live_objs-time.png)
|
|
|
|
|
|
|
|
|
fem did not do any G1 collections.
|
... | ... | @@ -101,31 +101,31 @@ Here are some slightly differet plots. The following show how number of live obj |
|
|
|
|
|
Plots of memtest (the tree application)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-live_objs.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g0-avg_block_dist-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-memtest-g1-avg_block_dist-live_objs.png)
|
|
|
|
|
|
|
|
|
Plots of real/fulsom (with input 8)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-live_objs.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g0-avg_block_dist-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fulsom-g1-avg_block_dist-live_objs.png)
|
|
|
|
|
|
|
|
|
Plots of real/pic (with input 20000)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-live_objs.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g0-avg_block_dist-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-pic-g1-avg_block_dist-live_objs.png)
|
|
|
|
|
|
|
|
|
Plots of real/fem (with fem.stdin)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g1-avg_block_dist-live_objs.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g0-avg_block_dist-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G2/plot-fem-g1-avg_block_dist-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G2/plot-fem-g1-avg_block_dist-live_objs.png)
|
|
|
|
|
|
|
|
|
Finally here are some plots of memtest run with 3 generations instead of 2.
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-avg_block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-live_objs-avg_block_dist.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-avg_block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-time-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g0-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g0-live_objs-avg_block_dist.png)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-avg_block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-live_objs-avg_block_dist.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-avg_block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-time-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g1-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g1-live_objs-avg_block_dist.png)
|
|
|
|
|
|
[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-avg_block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-block_dist.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-live_objs.png)[ http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-live_objs-avg_block_dist.png)
|
|
|
[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-avg_block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-block_dist.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-time-live_objs.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-time-live_objs.png)[http://www.cs.indiana.edu/\~rpjames/HaskellGC/G3/plot-memtest-g2-live_objs-avg_block_dist.png](http://www.cs.indiana.edu/~rpjames/HaskellGC/G3/plot-memtest-g2-live_objs-avg_block_dist.png)
|
|
|
|
|
|
|
|
|
Roshan James (rpjames \[at\] cs \[dot\] indiana \[dot\] edu) |