Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RISC-V vector spec v1.0 support #279

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ rdft/simd/kcvi/*.c
rdft/simd/neon/*.c
rdft/simd/sse2/*.c
rdft/simd/vsx/*.c
rdft/simd/rvv*/*.c
rdft/scalar/r2cb/*.c
rdft/scalar/r2cf/*.c
rdft/scalar/r2r/*.c
Expand All @@ -46,6 +47,7 @@ dft/simd/kcvi/*.c
dft/simd/neon/*.c
dft/simd/sse2/*.c
dft/simd/vsx/*.c
dft/simd/rvv*/*.c

# other generated files
ChangeLog
Expand Down
25 changes: 24 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,29 @@ GENERIC_SIMD256_LIBS = dft/simd/generic-simd256/libdft_generic_simd256_codelets.
rdft/simd/generic-simd256/librdft_generic_simd256_codelets.la
endif

if HAVE_RVV
RVV_LIBS = dft/simd/rvv128/libdft_rvv128_codelets.la \
rdft/simd/rvv128/librdft_rvv128_codelets.la \
dft/simd/rvv256/libdft_rvv256_codelets.la \
rdft/simd/rvv256/librdft_rvv256_codelets.la \
dft/simd/rvv512/libdft_rvv512_codelets.la \
rdft/simd/rvv512/librdft_rvv512_codelets.la \
dft/simd/rvv1024/libdft_rvv1024_codelets.la \
rdft/simd/rvv1024/librdft_rvv1024_codelets.la \
dft/simd/rvv2048/libdft_rvv2048_codelets.la \
rdft/simd/rvv2048/librdft_rvv2048_codelets.la \
dft/simd/rvv4096/libdft_rvv4096_codelets.la \
rdft/simd/rvv4096/librdft_rvv4096_codelets.la \
dft/simd/rvv8192/libdft_rvv8192_codelets.la \
rdft/simd/rvv8192/librdft_rvv8192_codelets.la \
dft/simd/rvv16384/libdft_rvv16384_codelets.la \
rdft/simd/rvv16384/librdft_rvv16384_codelets.la \
dft/simd/rvv32768/libdft_rvv32768_codelets.la \
rdft/simd/rvv32768/librdft_rvv32768_codelets.la \
dft/simd/rvv65536/libdft_rvv65536_codelets.la \
rdft/simd/rvv65536/librdft_rvv65536_codelets.la
endif

if THREADS
if COMBINED_THREADS
COMBINED_THREADLIBS=threads/libfftw3@PREC_SUFFIX@_threads.la
Expand All @@ -127,7 +150,7 @@ libfftw3@PREC_SUFFIX@_la_LIBADD = \
$(SIMD_LIBS) $(SSE2_LIBS) $(AVX_LIBS) $(AVX_128_FMA_LIBS) \
$(AVX2_LIBS) $(ALTIVEC_LIBS) \
$(VSX_LIBS) $(NEON_LIBS) $(KCVI_LIBS) $(AVX512_LIBS) \
$(GENERIC_SIMD128_LIBS) $(GENERIC_SIMD256_LIBS) \
$(GENERIC_SIMD128_LIBS) $(GENERIC_SIMD256_LIBS) $(RVV_LIBS) \
$(COMBINED_THREADLIBS)

if QUAD
Expand Down
4 changes: 4 additions & 0 deletions api/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,8 @@ const char X(version)[] = PACKAGE "-" PACKAGE_VERSION
"-generic_simd256"
#endif

#if defined(HAVE_RVV)
"-rvv"
#endif

;
3 changes: 3 additions & 0 deletions cmake.config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,9 @@
/* Define to enable ARM NEON optimizations. */
/* #undef HAVE_NEON */

/* Define to enable RISC-V Vector optimizations. */
/* #undef HAVE_RVV */

/* Define if OpenMP is enabled */
#cmakedefine HAVE_OPENMP

Expand Down
26 changes: 26 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,12 @@ if test "$have_generic_simd256" = "yes"; then
fi
AM_CONDITIONAL(HAVE_GENERIC_SIMD256, test "$have_generic_simd256" = "yes")

AC_ARG_ENABLE(rvv, [AC_HELP_STRING([--enable-rvv],[enable RISC-V V optimizations])], have_rvv=$enableval, have_rvv=no)
if test "$have_rvv" = "yes"; then
AC_DEFINE(HAVE_RVV,1,[Define to enable RISC-V V optimizations.])
fi
AM_CONDITIONAL(HAVE_RVV, test "$have_rvv" = "yes")


dnl FIXME:
dnl AC_ARG_ENABLE(mips-ps, [AS_HELP_STRING([--enable-mips-ps],[enable MIPS pair-single optimizations])], have_mips_ps=$enableval, have_mips_ps=no)
Expand Down Expand Up @@ -768,6 +774,16 @@ AC_CONFIG_FILES([
dft/simd/neon/Makefile
dft/simd/generic-simd128/Makefile
dft/simd/generic-simd256/Makefile
dft/simd/rvv128/Makefile
dft/simd/rvv256/Makefile
dft/simd/rvv512/Makefile
dft/simd/rvv1024/Makefile
dft/simd/rvv2048/Makefile
dft/simd/rvv4096/Makefile
dft/simd/rvv8192/Makefile
dft/simd/rvv16384/Makefile
dft/simd/rvv32768/Makefile
dft/simd/rvv65536/Makefile

rdft/Makefile
rdft/scalar/Makefile
Expand All @@ -788,6 +804,16 @@ AC_CONFIG_FILES([
rdft/simd/neon/Makefile
rdft/simd/generic-simd128/Makefile
rdft/simd/generic-simd256/Makefile
rdft/simd/rvv128/Makefile
rdft/simd/rvv256/Makefile
rdft/simd/rvv512/Makefile
rdft/simd/rvv1024/Makefile
rdft/simd/rvv2048/Makefile
rdft/simd/rvv4096/Makefile
rdft/simd/rvv8192/Makefile
rdft/simd/rvv16384/Makefile
rdft/simd/rvv32768/Makefile
rdft/simd/rvv65536/Makefile

reodft/Makefile

Expand Down
10 changes: 10 additions & 0 deletions dft/codelet-dft.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,15 @@ extern const solvtab X(solvtab_dft_vsx);
extern const solvtab X(solvtab_dft_neon);
extern const solvtab X(solvtab_dft_generic_simd128);
extern const solvtab X(solvtab_dft_generic_simd256);
extern const solvtab X(solvtab_dft_rvv128);
extern const solvtab X(solvtab_dft_rvv256);
extern const solvtab X(solvtab_dft_rvv512);
extern const solvtab X(solvtab_dft_rvv1024);
extern const solvtab X(solvtab_dft_rvv2048);
extern const solvtab X(solvtab_dft_rvv4096);
extern const solvtab X(solvtab_dft_rvv8192);
extern const solvtab X(solvtab_dft_rvv16384);
extern const solvtab X(solvtab_dft_rvv32768);
extern const solvtab X(solvtab_dft_rvv65536);

#endif /* __DFT_CODELET_H__ */
23 changes: 23 additions & 0 deletions dft/conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,27 @@ void X(dft_conf_standard)(planner *p)
#if HAVE_GENERIC_SIMD256
X(solvtab_exec)(X(solvtab_dft_generic_simd256), p);
#endif

#if HAVE_RVV
if (X(have_simd_rvv)(128))
X(solvtab_exec)(X(solvtab_dft_rvv128), p);
if (X(have_simd_rvv)(256))
X(solvtab_exec)(X(solvtab_dft_rvv256), p);
if (X(have_simd_rvv)(512))
X(solvtab_exec)(X(solvtab_dft_rvv512), p);
if (X(have_simd_rvv)(1024))
X(solvtab_exec)(X(solvtab_dft_rvv1024), p);
if (X(have_simd_rvv)(2048))
X(solvtab_exec)(X(solvtab_dft_rvv2048), p);
if (X(have_simd_rvv)(4096))
X(solvtab_exec)(X(solvtab_dft_rvv4096), p);
if (X(have_simd_rvv)(8192))
X(solvtab_exec)(X(solvtab_dft_rvv8192), p);
if (X(have_simd_rvv)(16384))
X(solvtab_exec)(X(solvtab_dft_rvv16384), p);
if (X(have_simd_rvv)(32768))
X(solvtab_exec)(X(solvtab_dft_rvv32768), p);
if (X(have_simd_rvv)(65536))
X(solvtab_exec)(X(solvtab_dft_rvv65536), p);
#endif
}
2 changes: 1 addition & 1 deletion dft/simd/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
AM_CPPFLAGS = -I $(top_srcdir)
SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256
SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256 rvv128 rvv256 rvv512 rvv1024 rvv2048 rvv4096 rvv8192 rvv16384 rvv32768 rvv65536
EXTRA_DIST = n1b.h n1f.h n2b.h n2f.h n2s.h q1b.h q1f.h t1b.h t1bu.h \
t1f.h t1fu.h t2b.h t2f.h t3b.h t3f.h ts.h codlist.mk simd.mk
12 changes: 12 additions & 0 deletions dft/simd/rvv1024/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv1024.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv1024_codelets.la
libdft_rvv1024_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv128/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv128.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv128_codelets.la
libdft_rvv128_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv16384/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv16384.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv16384_codelets.la
libdft_rvv16384_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv2048/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv2048.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv2048_codelets.la
libdft_rvv2048_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv256/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv256.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv256_codelets.la
libdft_rvv256_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv32768/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv32768.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv32768_codelets.la
libdft_rvv32768_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv4096/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv4096.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv4096_codelets.la
libdft_rvv4096_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv512/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv512.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv512_codelets.la
libdft_rvv512_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv65536/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv65536.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv65536_codelets.la
libdft_rvv65536_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
12 changes: 12 additions & 0 deletions dft/simd/rvv8192/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SIMD_HEADER=simd-support/simd-rvv8192.h

include $(top_srcdir)/dft/simd/codlist.mk
include $(top_srcdir)/dft/simd/simd.mk

if HAVE_RVV

BUILT_SOURCES = $(EXTRA_DIST)
noinst_LTLIBRARIES = libdft_rvv8192_codelets.la
libdft_rvv8192_codelets_la_SOURCES = $(BUILT_SOURCES)

endif
1 change: 1 addition & 0 deletions doc/install.texi
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ of the time). @xref{Cycle Counters}.
@code{--enable-altivec} (single),
@code{--enable-vsx} (single, double),
@code{--enable-neon} (single, double on aarch64),
@code{--enable-rvv} (single, double on risc-v vector),
@code{--enable-generic-simd128},
and
@code{--enable-generic-simd256}:
Expand Down
2 changes: 1 addition & 1 deletion doc/intro.texi
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ transform (DFT) and various special cases thereof.

@item FFTW supports arbitrary multi-dimensional data.

@item FFTW supports the SSE, SSE2, AVX, AVX2, AVX512, KCVI, Altivec, VSX, and
@item FFTW supports the SSE, SSE2, AVX, AVX2, AVX512, KCVI, Altivec, VSX, RISC-V V, and
NEON vector instruction sets.

@item FFTW includes parallel (multi-threaded) transforms
Expand Down
2 changes: 1 addition & 1 deletion doc/other.texi
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ special operations supported by some processors to perform a single
operation on several numbers (usually 2 or 4) simultaneously. SIMD
floating-point instructions are available on several popular CPUs:
SSE/SSE2/AVX/AVX2/AVX512/KCVI on some x86/x86-64 processors, AltiVec and
VSX on some POWER/PowerPCs, NEON on some ARM models. FFTW can be
VSX on some POWER/PowerPCs, NEON on some ARM models, V extension on some RISC-V models. FFTW can be
compiled to support the SIMD instructions on any of these systems.
@cindex SIMD
@cindex SSE
Expand Down
25 changes: 25 additions & 0 deletions kernel/cycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -562,3 +562,28 @@ static inline ticks getticks(void)
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif

#if defined(__riscv_xlen) && !defined(HAVE_TICK_COUNTER)
typedef uint64_t ticks;
static inline ticks getticks(void)
{
uint64_t result;
#if __riscv_xlen == 64
asm volatile("rdcycle %0" : "=r" (result));
#elif __riscv_xlen == 32
uint32_t l, h, h2;
asm volatile( "start:\n"
"rdcycleh %0\n"
"rdcycle %1\n"
"rdcycleh %2\n"
"bne %0, %2, start\n"
: "=r" (h), "=r" (l), "=r" (h2));
result = (((uint64_t)h)<<32) | ((uint64_t)l);
#else
#error "unknown __riscv_xlen"
#endif
return result;
}
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
5 changes: 3 additions & 2 deletions kernel/ifftw.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ extern void X(extract_reim)(int sign, R *c, R **r, R **i);
defined(HAVE_KCVI) || \
defined(HAVE_ALTIVEC) || defined(HAVE_VSX) || \
defined(HAVE_MIPS_PS) || \
defined(HAVE_GENERIC_SIMD128) || defined(HAVE_GENERIC_SIMD256)
defined(HAVE_GENERIC_SIMD128) || defined(HAVE_GENERIC_SIMD256) || defined(HAVE_RVV)
#define HAVE_SIMD 1
#else
#define HAVE_SIMD 0
Expand All @@ -119,6 +119,7 @@ extern int X(have_simd_avx512)(void);
extern int X(have_simd_altivec)(void);
extern int X(have_simd_vsx)(void);
extern int X(have_simd_neon)(void);
extern int X(have_simd_rvv)(int);

/* forward declarations */
typedef struct problem_s problem;
Expand Down Expand Up @@ -876,7 +877,7 @@ enum { TW_COS = 0, TW_SIN = 1, TW_CEXP = 2, TW_NEXT = 3,

typedef struct {
unsigned char op;
signed char v;
short v;
short i;
} tw_instr;

Expand Down
10 changes: 10 additions & 0 deletions rdft/codelet-rdft.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,16 @@ extern const solvtab X(solvtab_rdft_vsx);
extern const solvtab X(solvtab_rdft_neon);
extern const solvtab X(solvtab_rdft_generic_simd128);
extern const solvtab X(solvtab_rdft_generic_simd256);
extern const solvtab X(solvtab_rdft_rvv128);
extern const solvtab X(solvtab_rdft_rvv256);
extern const solvtab X(solvtab_rdft_rvv512);
extern const solvtab X(solvtab_rdft_rvv1024);
extern const solvtab X(solvtab_rdft_rvv2048);
extern const solvtab X(solvtab_rdft_rvv4096);
extern const solvtab X(solvtab_rdft_rvv8192);
extern const solvtab X(solvtab_rdft_rvv16384);
extern const solvtab X(solvtab_rdft_rvv32768);
extern const solvtab X(solvtab_rdft_rvv65536);

/* real-input & output DFT-like codelets (DHT, etc.) */
typedef struct kr2r_desc_s kr2r_desc;
Expand Down
Loading