implementing gpu library
This commit is contained in:
108
src/riscv_gpgpu/lib/lib.c
Normal file
108
src/riscv_gpgpu/lib/lib.c
Normal file
@@ -0,0 +1,108 @@
|
||||
#include "lib.h"
|
||||
|
||||
// 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)
|
||||
{
|
||||
|
||||
asm __volatile__("addi t5, sp, 0");
|
||||
for (unsigned i = 1; i < num_threads; i++)
|
||||
{
|
||||
|
||||
register unsigned cur_tid asm("t1") = i;
|
||||
asm __volatile__("addi sp, sp, -256");
|
||||
CLONE;
|
||||
}
|
||||
asm __volatile__("addi sp, t5, 0");
|
||||
|
||||
|
||||
register unsigned cur_tid asm("t1") = 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)
|
||||
{
|
||||
|
||||
// set_wid(wid);
|
||||
// set_func(func);
|
||||
|
||||
|
||||
|
||||
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;
|
||||
WSPAWN; // THIS SHOULD COPY THE CSR REGISTERS TO THE NEW WARP
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC)
|
||||
{
|
||||
// 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);
|
||||
// }
|
||||
|
||||
// asm __volatile__("addi sp, t5, 0");
|
||||
|
||||
createThreads(num_threads, 0, (unsigned) func);
|
||||
|
||||
|
||||
ECALL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
unsigned get_tid()
|
||||
{
|
||||
register unsigned tid asm("t1");
|
||||
}
|
||||
|
||||
void initiate_stack()
|
||||
{
|
||||
asm __volatile__("lui sp,0x7ffff");
|
||||
}
|
||||
30
src/riscv_gpgpu/lib/lib.h
Normal file
30
src/riscv_gpgpu/lib/lib.h
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
#ifndef __RISCV_GP_
|
||||
#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");
|
||||
#define JALRS asm __volatile__(".word 0x1bfe0eb":::"s10")
|
||||
#define ECALL asm __volatile__(".word 0x00000073")
|
||||
|
||||
|
||||
#define FUNC void (func)(unsigned)
|
||||
void createWarps(unsigned num_Warps, unsigned num_threads, FUNC);
|
||||
unsigned get_tid(void);
|
||||
void initiate_stack(void);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user