Skip to content

Commit

Permalink
add rsort
Browse files Browse the repository at this point in the history
  • Loading branch information
donggyukim committed Apr 3, 2018
1 parent 2214d13 commit 9847732
Show file tree
Hide file tree
Showing 5 changed files with 183 additions and 0 deletions.
2 changes: 2 additions & 0 deletions benchmarks/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ bmarks = \
cmplxmult \
imax \
spmv \
rsort \
vec-vvadd \
vec-csaxpy \
vec-dgemv \
vec-dgemm \
vec-imax \
vec-spmv \
vec-rsort \

#--------------------------------------------------------------------
# Build rules
Expand Down
1 change: 1 addition & 0 deletions benchmarks/vec-rsort/dataset1-test.h
1 change: 1 addition & 0 deletions benchmarks/vec-rsort/dataset1.h
135 changes: 135 additions & 0 deletions benchmarks/vec-rsort/vec-rsort.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
#include "rvv.h"

.text
.align 2

.globl vec_rsort
.type vec_rsort,@function

# assumes calling convention:
# a0 has int n
# a1 has type* arrIn <---
# a2 has type* scratchIn
# a3 has int* buckets
# a4 has int log_base
vec_rsort:
# TODO: prologue
addi sp, sp, -64
sd s0, 56(sp)
sd s1, 48(sp)
sd s2, 40(sp)
sd s3, 32(sp)
sd s4, 24(sp)
sd s5, 16(sp)
sd s6, 8(sp)
sd s7, 0(sp)

# Step 1: Configure machine
# TODO: change configurations if necessary
# configuration:
# v0-v7: 32 bit int vector
# v8-v15: 32 bit int scalar
# v16-v31: 32 bit int vector
setvcfg(vcfg0, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)
setvcfg(vcfg2, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)
setvcfg(vcfg4, \
SCALAR | INT | W32, \
SCALAR | INT | W32, \
SCALAR | INT | W32, \
SCALAR | INT | W32)
setvcfg(vcfg6, \
SCALAR | INT | W32, \
SCALAR | INT | W32, \
SCALAR | INT | W32, \
SCALAR | INT | W32)
setvcfg(vcfg8, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)
setvcfg(vcfg10, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)
setvcfg(vcfg12, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)
setvcfg(vcfg14, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32, \
VECTOR | INT | W32)

# s0 = base
li s0, 1
sll s0, s0, a4
mv s1, x0 # s1 = log_exp
mv s2, a1 # s2 = arr
mv s3, a2 # s3 = scratch
li s4, 1 # s4 = 1
li s5, -1 # s5 = 1
li s6, 32 # s6 = CHAR_BIT * sizeof(type)

while_loop:
# Step 2: Reset buckets
bucket_init:

# Step 3: Assign buckets
to_buckets:
setvl(t0, t1) # set VL
# TODO: find digits
# TODO: count and prune duplicate digits
# TODO: increment buckets

# Step 4: Add offsets to buckets

# Step 5: Merge buckets
from_buckets:
setvl(t0, t1) # set VL

# TODO: find digits
# TODO: count and prune duplicate digits
# TODO: decrement buckets
# TODO: store scratch

# Step 6: Swap arr & scratch

# Step 7: Loop arithmatic

# Call memcpy before return
beq a1, s2, rsort_done
mv t1, a0
sll t1, t1, 2
mv a0, a1 # arrIn
mv a1, s2 # arr
mv a2, t1 # n * sizeof(type)

addi sp, sp, -8
sd ra, 0(sp)
jal memcpy
ld ra, 0(sp)
addi sp, sp, 8

rsort_done:
# TODO: epilogue
ld s0, 56(sp)
ld s1, 48(sp)
ld s2, 40(sp)
ld s3, 32(sp)
ld s4, 24(sp)
ld s5, 16(sp)
ld s6, 8(sp)
ld s7, 0(sp)
addi sp, sp, 64
ret
44 changes: 44 additions & 0 deletions benchmarks/vec-rsort/vec-rsort.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// See LICENSE for license details.

//**************************************************************************
// Quicksort benchmark
//--------------------------------------------------------------------------
//
// This benchmark uses quicksort to sort an array of integers. The
// implementation is largely adapted from Numerical Recipes for C. The
// input data (and reference data) should be generated using the
// qsort_gendata.pl perl script and dumped to a file named
// dataset1.h

#include "util.h"
#include <string.h>
#include <limits.h>

//--------------------------------------------------------------------------
// Input/Reference Data

#define type unsigned int
#include "dataset1.h"
// #include "dataset1-test.h"

#define LOG_BASE 3
#define BASE (1 << LOG_BASE)

void vec_rsort(int n, type* arrIn, type* scratchIn, int* buckets, int log_base);

//--------------------------------------------------------------------------
// Main

int main( int argc, char* argv[] )
{
static type scratch[DATA_SIZE];
static int buckets[BASE];

// Do the sort
setStats(1);
vec_rsort(DATA_SIZE, input_data, scratch, buckets, LOG_BASE);
setStats(0);

// Check the results
return verify( DATA_SIZE, input_data, verify_data );
}

0 comments on commit 9847732

Please sign in to comment.