Merge pull request #111 from HecaiYuan/master

loongarch: add loongarch simd opt
This commit is contained in:
mborgerding
2026-05-11 20:03:41 -04:00
committed by GitHub
12 changed files with 192 additions and 7 deletions

View File

@@ -2,6 +2,14 @@ function(add_kissfft_test_executable NAME)
add_kissfft_executable(${NAME} ${ARGN})
target_include_directories(${NAME} PRIVATE ..)
if(HAVE_LASX)
target_compile_options(${NAME} PRIVATE -mlasx)
endif()
if(HAVE_LSX)
target_compile_options(${NAME} PRIVATE -mlsx)
endif()
add_test(NAME ${NAME} COMMAND ${NAME})
set_tests_properties(${NAME} PROPERTIES TIMEOUT 3600)
endfunction()
@@ -46,7 +54,11 @@ add_kissfft_test_executable(testcpp testcpp.cc)
if(KISSFFT_DATATYPE MATCHES "^simd$")
add_kissfft_test_executable(tsimd test_simd.c)
target_compile_definitions(tsimd PRIVATE USE_SIMD)
if (NOT MSVC)
if(HAVE_LASX)
target_compile_options(kissfft PRIVATE -mlasx)
elseif(HAVE_LSX)
target_compile_options(kissfft PRIVATE -mlsx)
elseif(NOT MSVC)
target_compile_options(kissfft PRIVATE -msse)
else()
target_compile_options(kissfft PRIVATE "/arch:SSE")

View File

@@ -138,7 +138,13 @@ endif
$(TESTSIMD): test_simd.c
ifeq "$(KISSFFT_DATATYPE)" "simd"
ifeq "$(HAVE_LASX)" "lasx"
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -DHAVE_LASX=1 -mlasx $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
else ifeq "$(HAVE_LSX)" "lsx"
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -DHAVE_LSX=1 -mlsx $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
else
$(CC) -o $@ -g $(CFLAGS) -DUSE_SIMD=1 -msse $< -L.. -l$(KISSFFTLIB_SHORTNAME) -lm
endif
else
$(error ERROR: This test makes sense only with KISSFFT_DATATYPE=simd)
endif

View File

@@ -70,8 +70,13 @@ int main(int argc,char ** argv)
nbytes *= nfft[k];
#ifdef USE_SIMD
#ifdef HAVE_LASX
numffts /= 8;
fprintf(stderr,"since SIMD implementation does 8 ffts at a time, numffts is being reduced to %d\n",numffts);
#else
numffts /= 4;
fprintf(stderr,"since SIMD implementation does 4 ffts at a time, numffts is being reduced to %d\n",numffts);
#endif
#endif
buf=(kiss_fft_cpx*)KISS_FFT_MALLOC(nbytes);

View File

@@ -22,7 +22,15 @@ static
kiss_fft_scalar rand_scalar(void)
{
#ifdef USE_SIMD
#ifdef HAVE_LASX
float tmp = rand()-RAND_MAX/2;
return (__m256)(__lasx_xvldrepl_w(&tmp, 0));
#elif defined(HAVE_LSX)
float tmp = rand()-RAND_MAX/2;
return (__m128)(__lsx_vldrepl_w(&tmp, 0));
#else
return _mm_set1_ps(rand()-RAND_MAX/2);
#endif
#else
kiss_fft_scalar s = (kiss_fft_scalar)(rand() -RAND_MAX/2);
return s/2;

View File

@@ -6,16 +6,30 @@ static void test1(void)
int n[2] = {256,256};
size_t nbytes = sizeof(kiss_fft_cpx)*n[0]*n[1];
#if defined(HAVE_LSX) || defined(HAVE_LASX)
kiss_fft_cpx * inbuf = NULL;
kiss_fft_cpx * outbuf = NULL;
if (posix_memalign((void**)&inbuf, 16, nbytes) ||
posix_memalign((void**)&outbuf, 16, nbytes))
return;
#else
kiss_fft_cpx * inbuf = _mm_malloc(nbytes,16);
kiss_fft_cpx * outbuf = _mm_malloc(nbytes,16);
#endif
memset(inbuf,0,nbytes);
memset(outbuf,0,nbytes);
kiss_fftnd_cfg cfg = kiss_fftnd_alloc(n,2,is_inverse,0,0);
kiss_fftnd(cfg,inbuf,outbuf);
kiss_fft_free(cfg);
#if defined(HAVE_LSX) || defined(HAVE_LASX)
free(inbuf);
free(outbuf);
#else
_mm_free(inbuf);
_mm_free(outbuf);
#endif
}
int main(void)

View File

@@ -38,8 +38,16 @@ double two_tone_test( int nfft, int bin1,int bin2)
/* generate a signal with two tones*/
for (i = 0; i < nfft; i++) {
#ifdef USE_SIMD
#ifdef HAVE_LASX
float tmp = (maxrange>>1)*cos(f1*i) + (maxrange>>1)*cos(f2*i);
tbuf[i] = (__m256)__lasx_xvldrepl_w(&tmp, 0);
#elif defined(HAVE_LSX)
float tmp = (maxrange>>1)*cos(f1*i) + (maxrange>>1)*cos(f2*i);
tbuf[i] = (__m128)__lsx_vldrepl_w(&tmp, 0);
#else
tbuf[i] = _mm_set1_ps( (maxrange>>1)*cos(f1*i)
+ (maxrange>>1)*cos(f2*i) );
#endif
#else
tbuf[i] = (maxrange>>1)*cos(f1*i)
+ (maxrange>>1)*cos(f2*i);