feat: optimize startup and linking
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
TARGET = user-sample
|
||||
|
||||
MATMUL_GROUP_NUM ?= 5000
|
||||
CFLAGS += -O3 -g -DMATMUL_GROUP_NUM=$(MATMUL_GROUP_NUM)
|
||||
MATMUL_WRITEBACK_RESULTS ?= 0
|
||||
MATMUL_FAST_START ?= 1
|
||||
CFLAGS += -O3 -g -DMATMUL_GROUP_NUM=$(MATMUL_GROUP_NUM) -DMATMUL_WRITEBACK_RESULTS=$(MATMUL_WRITEBACK_RESULTS) -DMATMUL_FAST_START=$(MATMUL_FAST_START)
|
||||
|
||||
C_SRCS := $(wildcard ./*.c )
|
||||
|
||||
@@ -9,6 +11,14 @@ OBJDIR = obj
|
||||
COMMON_DIR = ../../bsp
|
||||
GCC_DIR=../../../toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0
|
||||
PICOLIBC_DIR=../../../toolchains/picolibc
|
||||
|
||||
ifeq ($(MATMUL_FAST_START),1)
|
||||
LINKER_SCRIPT := script_matmul_fast.lds
|
||||
BSP_STARTUP := start_matmul_fast.S
|
||||
BSP_USE_TRAP := 0
|
||||
BSP_USE_DRIVERS := 0
|
||||
endif
|
||||
|
||||
include ../../bsp/common.mk
|
||||
|
||||
# Strip picolibc: no -lc -lm -lg -lsemihost, keep -lgcc only
|
||||
|
||||
90
sdk/software/examples/asm/script_matmul_fast.lds
Normal file
90
sdk/software/examples/asm/script_matmul_fast.lds
Normal file
@@ -0,0 +1,90 @@
|
||||
OUTPUT_ARCH(loongarch)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
isram (rwxai) : ORIGIN = 0x1c000000, LENGTH = 512K
|
||||
dsram (rwxai) : ORIGIN = 0x1c080000, LENGTH = 512K
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
__stack_size = DEFINED(__stack_size) ? __stack_size : 4K;
|
||||
|
||||
.init :
|
||||
{
|
||||
KEEP(*(SORT_NONE(.init)))
|
||||
} >isram AT>isram
|
||||
|
||||
. = ALIGN(16);
|
||||
.text :
|
||||
{
|
||||
_ftext = .;
|
||||
*(.text.unlikely .text.unlikely.*)
|
||||
*(.text.startup .text.startup.*)
|
||||
*(.text .text.*)
|
||||
*(.gnu.linkonce.t.*)
|
||||
} >isram AT>isram
|
||||
|
||||
. = ALIGN(16);
|
||||
.rodata :
|
||||
{
|
||||
*(.rdata)
|
||||
*(.rodata .rodata.*)
|
||||
*(.gnu.linkonce.r.*)
|
||||
*(.srodata.cst16)
|
||||
*(.srodata.cst8)
|
||||
*(.srodata.cst4)
|
||||
*(.srodata.cst2)
|
||||
*(.srodata .srodata.*)
|
||||
} >isram AT>isram
|
||||
|
||||
. = ALIGN(16);
|
||||
PROVIDE(__etext = .);
|
||||
PROVIDE(_etext = .);
|
||||
PROVIDE(etext = .);
|
||||
PROVIDE(_data_lma = .);
|
||||
|
||||
.data ORIGIN(dsram) :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data .data.*)
|
||||
*(.gnu.linkonce.d.*)
|
||||
. = ALIGN(16);
|
||||
PROVIDE(__global_pointer$ = . + 0x800);
|
||||
*(.sdata .sdata.*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
. = ALIGN(16);
|
||||
PROVIDE(_edata = .);
|
||||
PROVIDE(edata = .);
|
||||
} >dsram AT>isram
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(__bss_start = .);
|
||||
*(.sbss*)
|
||||
*(.sbss.*)
|
||||
*(.dynsbss)
|
||||
*(.scommon)
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.sb.*)
|
||||
*(.gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
. = ALIGN(16);
|
||||
PROVIDE(_end = .);
|
||||
PROVIDE(end = .);
|
||||
} >dsram AT>dsram
|
||||
|
||||
PROVIDE(__heap_start = _end);
|
||||
|
||||
.stack ORIGIN(dsram) + LENGTH(dsram) - __stack_size :
|
||||
{
|
||||
PROVIDE(_heap_end = .);
|
||||
PROVIDE(__heap_end = _heap_end);
|
||||
PROVIDE(__heap_size = __heap_end - __heap_start);
|
||||
. = __stack_size;
|
||||
PROVIDE(_stack = .);
|
||||
} >dsram AT>dsram
|
||||
}
|
||||
54
sdk/software/examples/asm/start_matmul_fast.S
Normal file
54
sdk/software/examples/asm/start_matmul_fast.S
Normal file
@@ -0,0 +1,54 @@
|
||||
#include "regdef.h"
|
||||
|
||||
.section .init
|
||||
.globl _start
|
||||
.type _start, @function
|
||||
|
||||
_start:
|
||||
/* Enable direct mapped windows used by SRAM and uncached peripherals. */
|
||||
li.w t0, 0x8
|
||||
li.w t1, 0x18
|
||||
csrxchg t0, t1, csr_crmd
|
||||
|
||||
csrwr zero, csr_dmw0
|
||||
csrwr zero, csr_dmw1
|
||||
li.w t0, 0x19
|
||||
csrwr t0, csr_dmw0
|
||||
li.w t0, 0xa0000009
|
||||
csrwr t0, csr_dmw1
|
||||
|
||||
li.w t0, 0x10
|
||||
li.w t1, 0x18
|
||||
csrxchg t0, t1, csr_crmd
|
||||
|
||||
/* Polling-only benchmark: keep interrupts disabled. */
|
||||
li.w t0, 0x4
|
||||
csrxchg zero, t0, csr_crmd
|
||||
csrwr zero, csr_prmd
|
||||
csrwr zero, csr_ecfg
|
||||
|
||||
/* UART0 init, 115200 baud with the same divisor selection as BSP start.S. */
|
||||
li.w t0, 0xbf000000
|
||||
li.w t1, 0x07
|
||||
st.b t1, t0, 2
|
||||
li.w t1, 0x80
|
||||
st.b t1, t0, 3
|
||||
st.b zero, t0, 1
|
||||
li.w t2, 0xbf20f500
|
||||
ld.w t2, t2, 0
|
||||
li.w t1, 0x1b
|
||||
beq zero, t2, 1f
|
||||
li.w t1, 0x1
|
||||
1:
|
||||
st.b t1, t0, 0
|
||||
li.w t1, 0x03
|
||||
st.b t1, t0, 3
|
||||
st.b zero, t0, 4
|
||||
|
||||
la.local sp, _stack
|
||||
li.w a0, 0
|
||||
li.w a1, 0
|
||||
bl main
|
||||
|
||||
1:
|
||||
b 1b
|
||||
@@ -26,6 +26,23 @@ static void uart_puts(const char *s)
|
||||
}
|
||||
}
|
||||
|
||||
static void uart_put_matmul_start_fifo(void)
|
||||
{
|
||||
UART_THR = 'M';
|
||||
UART_THR = 'A';
|
||||
UART_THR = 'T';
|
||||
UART_THR = 'M';
|
||||
UART_THR = 'U';
|
||||
UART_THR = 'L';
|
||||
UART_THR = '_';
|
||||
UART_THR = 'S';
|
||||
UART_THR = 'T';
|
||||
UART_THR = 'A';
|
||||
UART_THR = 'R';
|
||||
UART_THR = 'T';
|
||||
UART_THR = '\n';
|
||||
}
|
||||
|
||||
static void uart_puthex(unsigned int val)
|
||||
{
|
||||
int i;
|
||||
@@ -44,7 +61,9 @@ static void uart_puthex(unsigned int val)
|
||||
#define MATMUL_WRITEBACK_RESULTS 1
|
||||
#endif
|
||||
|
||||
#if MATMUL_FAST_START == 0
|
||||
unsigned long UART_BASE = 0xbf000000;
|
||||
#endif
|
||||
|
||||
#define EXTRAM_BASE_PHYS 0x1c400000u
|
||||
#define SRC_BASE_WORDS 0u
|
||||
@@ -65,8 +84,6 @@ int main(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
uart_puts("MATMUL_START\n");
|
||||
|
||||
DMA_SEQ->STATUS = SEQ_DONE_BIT;
|
||||
DMA_SEQ->SRC_BASE = EXTRAM_PHYS_AB(0);
|
||||
DMA_SEQ->DST_BASE = EXTRAM_PHYS_C(0);
|
||||
@@ -78,6 +95,8 @@ int main(void)
|
||||
#if MATMUL_WRITEBACK_RESULTS == 0
|
||||
seq_ctrl |= SEQ_SKIP_STORE_BIT;
|
||||
#endif
|
||||
|
||||
uart_put_matmul_start_fifo();
|
||||
DMA_SEQ->CTRL = seq_ctrl;
|
||||
|
||||
while ((DMA_SEQ->STATUS & SEQ_DONE_BIT) == 0u) {
|
||||
|
||||
Reference in New Issue
Block a user