使用fftw3.3.6启用线程和浮点数时的未定义引用

时间:2017-12-08 12:29:57

标签: c multithreading fftw

我在我的Ubuntu 16.04上安装了fftw3.3.6,以测试在启用线程和浮动的情况下使用该库的性能。

第1步:

使用thread和float安装库并启用SIMD指令:`

sudo ./configure --enable-float --enable-generic-simd128 --enable-generic-simd256 --enable-threads
make
make install

第2步:

我编写了这段代码(基于手册和教程),使用4个线程(复杂到复杂)来计算1024个点的fft:

#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>

#include "input.h"

#define         NUMBER_OF_ELEMENTS              1024
#define         NUM_THREADS                     4

void Load_inputs(fftwf_complex* data)
{
   int i;

   for(i=0;i<NUMBER_OF_ELEMENTS;i++)
   {
      data[i][0] = input_data[2 * i];
      data[i][1] = input_data[2 * i + 1];
   }
}


int main()
{
   fftwf_complex array[NUMBER_OF_ELEMENTS];
   fftwf_plan p;
   int i;

   fftwf_init_threads();
   fftwf_plan_with_nthreads(NUM_THREADS);
   p = fftwf_plan_dft(1,NUMBER_OF_ELEMENTS,array,array,FFTW_FORWARD,FFTW_EXHAUSTIVE);
   Load_inputs(array); //function to load input data from input.h file to array[]
   fftwf_execute(p);
   FILE* res = NULL;
   res = fopen("result.txt", "w");
   for ( i = 0; i <1024; i++ )
   {
       fprintf(res,"RE = %f \t IM  = %f\n",array[i][0], array[i][1] );
   }
   fclose(res);
   fftwf_destroy_plan(p);
   fftwf_cleanup_threads();
}

然后,我用这个makefile编译了这个程序。

CC=gcc
CFLAGS=-g3 -c -Wall -O0 -mavx -mfma -ffast-math 

SOURCES=$ test.c
OBJECTS=$(SOURCES:.c=.o)

EXECUTABLE=test


all: $(TASKMAP) $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
     $(CC) $(OBJECTS) -o $@ -L -lfftw3f_threads -lfftw3f 

.c.o:
     $(CC) $(CFLAGS) $< -lm -o $@

clean: 
     rm -fr $(OBJECTS) $(EXECUTABLE)

编译错误:

编译后我遇到了这些错误:

gcc test.o -o test -L -lfftw3f_threads -lfftw3f 
//usr/local/lib/libfftw3f.a(mapflags.o): In function `fftwf_mapflags':
mapflags.c:(.text+0x346): undefined reference to `__log_finite'
Makefile:13: recipe for target 'test' failed
//usr/local/lib/libfftw3f.a(trig.o): In function `cexpl_sincos':
trig.c:(.text+0x2c1): undefined reference to `sincos'
//usr/local/lib/libfftw3f.a(trig.o): In function `fftwf_mktriggen':
trig.c:(.text+0x50b): undefined reference to `sincos'
trig.c:(.text+0x653): undefined reference to `sincos'
test.o: In function `main':
/home/anouar/workspace/Thread_example//test.c:27: undefined reference to `fftwf_init_threads'
/home/anouar/workspace/Thread_example//test.c:28: undefined reference to `fftwf_plan_with_nthreads'
/home/anouar/workspace/Thread_example//test.c:40: undefined reference to `fftwf_cleanup_threads'
 collect2: error: ld returned 1 exit status
 make: *** [test] Error 1

在安装和编译过程中是否有遗漏或错误的东西?

2 个答案:

答案 0 :(得分:2)

阅读精细手册。来自https://github.com/FezVrasta/popper.js

  

链接.c.o: $(CC) $(CFLAGS) $< -lm -o $@

在程序的 compile 阶段使用-lm是没用的:

$(EXECUTABLE): $(OBJECTS) 
     $(CC) $(OBJECTS) -o $@ -L -lfftw3f_threads -lfftw3f -lm

{{1}}需要位于链接阶段:

{{1}}

答案 1 :(得分:0)

在我的情况下,

的问题
undefined reference to `__log_finite'

可以通过编译而不使用-ffast-math选项来解决。