Completed support for WSPAWN, CLONE, and JALRS
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user