Completed support for WSPAWN, CLONE, and JALRS

This commit is contained in:
felsabbagh3
2019-02-14 03:32:58 -05:00
parent 39003073f9
commit 6c493cc4de
12 changed files with 408 additions and 9677 deletions

View File

@@ -3,93 +3,75 @@
// namespace Sphinx
// {
#define FUNC void (func)(unsigned)
void set_wid(unsigned i)
{
SET_WID(i);
}
void set_func(FUNC)
{
SET_FUNC(func);
}
unsigned get_func()
{
unsigned ret;
GET_FUNC(ret);
return ret;
}
unsigned get_wid()
{
unsigned ret;
GET_WID(ret);
return ret;
}
void createThreads(unsigned num_threads, unsigned wid, unsigned func_addr)
void createThreads(unsigned num_threads, unsigned wid, unsigned func_addr, unsigned * x_ptr, unsigned * y_ptr, unsigned * z_ptr)
{
register unsigned *xx asm("s2") = x_ptr;
register unsigned *yy asm("s3") = y_ptr;
register unsigned *zz asm("s4") = z_ptr;
register unsigned wid_ asm("s1") = wid;
asm __volatile__("addi t5, sp, 0");
for (unsigned i = 1; i < num_threads; i++)
{
register unsigned cur_tid asm("t1") = i;
register unsigned cur_tid asm("a0") = i;
register unsigned not_sure asm("t1") = i;
asm __volatile__("addi sp, sp, -256");
CLONE;
}
asm __volatile__("addi sp, t5, 0");
register unsigned cur_tid asm("t1") = 0;
register unsigned cur_tid asm("a0") = 0;
// jalis TO FUNC
register unsigned num_lanes asm("t6") = func_addr;
register unsigned link asm("s11") = num_threads;
register unsigned n_threads asm("a0") = wid;
JALRS;
ECALL;
}
void wspawn(unsigned num_threads, unsigned wid, FUNC)
void wspawn(unsigned num_threads, unsigned wid, FUNC, unsigned * x_ptr, unsigned * y_ptr, unsigned * z_ptr)
{
// set_wid(wid);
// set_func(func);
register unsigned *tzz asm("t2") = z_ptr;
register unsigned func_add asm("t1") = (unsigned) &createThreads;
register unsigned n_threads asm("a0") = num_threads;
register unsigned wwid asm("a1") = wid;
register unsigned ffunc asm("a2") = (unsigned) func;
register unsigned func_add asm("t1") = (unsigned) &createThreads;
register unsigned *xx asm("a3") = x_ptr;
register unsigned *yy asm("a4") = y_ptr;
register unsigned *zz asm("a5") = tzz;
WSPAWN; // THIS SHOULD COPY THE CSR REGISTERS TO THE NEW WARP
}
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC)
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC, unsigned * x_ptr, unsigned * y_ptr, unsigned * z_ptr)
{
// asm __volatile__("addi t5, sp, 0");
asm __volatile__("addi t5, sp, 0");
// for (unsigned i = 1; i < num_Warps; i++)
// {
// asm __volatile__("addi sp, sp, -2048");
// wspawn(num_threads, i, func);
// }
for (unsigned i = 1; i < num_Warps; i++)
{
asm __volatile__("addi sp, sp, -2048");
wspawn(num_threads, i, func, x_ptr, y_ptr, z_ptr);
}
// asm __volatile__("addi sp, t5, 0");
asm __volatile__("addi sp, t5, 0");
createThreads(num_threads, 0, (unsigned) func);
createThreads(num_threads, 0, (unsigned) func, x_ptr, y_ptr, z_ptr);
ECALL;
@@ -97,12 +79,37 @@ void createWarps(unsigned num_Warps, unsigned num_threads, FUNC)
}
unsigned get_tid()
unsigned get_wid()
{
register unsigned tid asm("t1");
register unsigned ret asm("s1");
return ret;
}
unsigned * get_1st_arg(void)
{
register unsigned *ret asm("s2");
return ret;
}
unsigned * get_2nd_arg(void)
{
register unsigned *ret asm("s3");
return ret;
}
unsigned * get_3rd_arg(void)
{
register unsigned *ret asm("s4");
return ret;
}
void initiate_stack()
{
asm __volatile__("lui sp,0x7ffff");
}
}

View File

@@ -3,15 +3,6 @@
#define __RISCV_GP_
#define WID_CSR 0x00E
#define FUNC_CSR 0x00F
#define SET_WID(val) asm __volatile__("csrw 0x00e,%0"::"r"(val));
#define GET_WID(ret) asm __volatile__("csrr %0,0x00e":"=r"(ret));
#define SET_FUNC(val) asm __volatile__("csrw 0x00f,%0"::"r"(val));
#define GET_FUNC(ret) asm __volatile__("csrr %0,0x00f":"=r"(ret));
#define WSPAWN asm __volatile__(".word 0x3006b"::);
#define CLONE asm __volatile__(".word 0x3506b":::"t1");
@@ -20,9 +11,13 @@
#define FUNC void (func)(unsigned)
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC);
unsigned get_tid(void);
void initiate_stack(void);
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC, unsigned *, unsigned *, unsigned *);
unsigned get_wid();
unsigned * get_1st_arg(void);
unsigned * get_2nd_arg(void);
unsigned * get_3rd_arg(void);
void initiate_stack();