OpenBLASのコンパイルをベアメタルで実行したいのだが、かなり壁があるようだ。メモリアクセスに関する関数がベアメタルだと上手く行かないので、その辺を何とかごまかす必要がある。
Pthreadのサポートなども使えないので、その辺を取り除いて試行しているが、まだ上手く行かない。
diff --git a/Makefile.prebuild b/Makefile.prebuild index d6395da7..e774625b 100644 --- a/Makefile.prebuild +++ b/Makefile.prebuild @@ -42,7 +42,7 @@ TARGET_FLAGS = -mips64r6 endif ifeq ($(TARGET), C910V) -TARGET_FLAGS = -march=rv64gcvxthead -mabi=lp64v +TARGET_FLAGS = -march=rv64gcvxthead -mabi=lp64 endif all: getarch_2nd diff --git a/Makefile.riscv64 b/Makefile.riscv64 index 15d7b059..6c3bacbd 100644 --- a/Makefile.riscv64 +++ b/Makefile.riscv64 @@ -1,4 +1,4 @@ ifeq ($(CORE), C910V) -CCOMMON_OPT += -march=rv64gcvxthead -mabi=lp64v -FCOMMON_OPT += -march=rv64gcvxthead -mabi=lp64v -static +CCOMMON_OPT += -march=rv64gcv -mabi=lp64 +FCOMMON_OPT += -march=rv64gcv -mabi=lp64 -static endif
diff --git a/common.h b/common.h index 2825407c..c6e353cb 100644 --- a/common.h +++ b/common.h @@ -123,9 +123,9 @@ extern "C" { #undef GOTO_ATOM #endif #else -#include <sys/mman.h> + // #include <sys/mman.h> #ifndef NO_SYSV_IPC -#include <sys/shm.h> + // #include <sys/shm.h> #endif #include <sys/time.h> #include <time.h>
メモリアクセス関連のインクルードファイルをひたすら取り除く。最終的にmemory.cのコンパイルを止めた。
diff --git a/driver/others/Makefile b/driver/others/Makefile index d09444f5..250ee444 100644 --- a/driver/others/Makefile +++ b/driver/others/Makefile @@ -1,7 +1,7 @@ TOPDIR = ../.. include ../../Makefile.system -COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX) +COMMONOBJS = xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX) #COMMONOBJS += slamch.$(SUFFIX) slamc3.$(SUFFIX) dlamch.$(SUFFIX) dlamc3.$(SUFFIX)
これでもまだリンクに到達できない。ベアメタルのRISC-Vコンパイラではベクトル系のマクロが登録されていないため、エラーとなってしまっている。
../kernel/riscv64/amax_vector.c: In function 'samax_k': ../kernel/riscv64/amax_vector.c:34:19: error: unknown type name 'float32xm8_t' 34 | #define FLOAT_V_T float32xm8_t | ^~~~~~~~~~~~ ../kernel/riscv64/amax_vector.c:64:9: note: in expansion of macro 'FLOAT_V_T' 64 | FLOAT_V_T v0, v1, v_max; | ^~~~~~~~~ ../kernel/riscv64/amax_vector.c:38:16: error: unknown type name 'e32xm8_t' 38 | #define MASK_T e32xm8_t | ^~~~~~~~ ../kernel/riscv64/amax_vector.c:66:9: note: in expansion of macro 'MASK_T' 66 | MASK_T mask0, mask1; | ^~~~~~ ../kernel/riscv64/amax_vector.c:69:23: warning: implicit declaration of function 'vsetvli' [-Wimplicit-function-declaration] 69 | gvl = vsetvli(n, RVV_EFLOAT, RVV_M); | ^~~~~~~ ../kernel/riscv64/amax_vector.c:32:20: error: 'RVV_E32' undeclared (first use in this function); did you mean 'RVV_M'? 32 | #define RVV_EFLOAT RVV_E32 | ^~~~~~~ ../kernel/riscv64/amax_vector.c:69:34: note: in expansion of macro 'RVV_EFLOAT' 69 | gvl = vsetvli(n, RVV_EFLOAT, RVV_M); | ^~~~~~~~~~ ../kernel/riscv64/amax_vector.c:32:20: note: each undeclared identifier is reported only once for each function it appears in 32 | #define RVV_EFLOAT RVV_E32 | ^~~~~~~ ../kernel/riscv64/amax_vector.c:69:34: note: in expansion of macro 'RVV_EFLOAT' 69 | gvl = vsetvli(n, RVV_EFLOAT, RVV_M); | ^~~~~~~~~~ ../kernel/riscv64/iamax_vector.c: In function 'isamax_k': ../kernel/riscv64/iamax_vector.c:59:19: error: unknown type name 'float32xm8_t'