我正在尝试在pthreads中使用fftw_execute。代码很简单所以我希望你能帮我安静地找到错误。 我使用pthreads ON PURPOSE因为fftw提供的线程不会加速。
我想要为输入,输出和计划创建数组。规划和创建后,我开始传递计划的线程。最后,我只是想加入线程并释放内存。
段错误发生在释放进出数组。 评论线程部分一切都很好。
struct thread_info { /* Used as argument to thread_start() */
pthread_t thread_id; /* ID returned by pthread_create() */
int thread_num; /* Application-defined thread # */
};
struct tmp{
int thread_id_app;
fftw_plan plan;
};
static void *th_fft(void *arg){
struct tmp *tmp = static_cast<struct tmp *>(arg);
fftw_execute(tmp->plan);
cout<<"entered the thread: "<< (int)tmp->thread_id_app <<endl;
}
int main(int argc, char **argv) {
int threads,reps,fftlen;
threads=atoi(argv[1]);
reps=atoi(argv[2]);
fftlen=atoi(argv[3]);
struct tmp *tmp = (struct tmp*)calloc(threads, sizeof(struct tmp));
pthread_attr_t attr;
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
int s;
void *res;
struct thread_info *tinfo;
tinfo =(struct thread_info*) calloc(threads, sizeof(struct thread_info));
fftw_complex** in = (fftw_complex**)fftw_malloc(sizeof(fftw_complex*));
fftw_complex** out = (fftw_complex**)fftw_malloc(sizeof(fftw_complex*));
pthread_attr_init(&attr);
for(int8_t tnum =0;tnum<threads;++tnum){
in[tnum] = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * fftlen);
out[tnum] = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * fftlen);
tmp[tnum].plan = fftw_plan_dft_1d(fftlen,in[tnum], out[tnum], FFTW_FORWARD , FFTW_ESTIMATE);
tmp[tnum].thread_id_app = tnum+1;
}
for(int8_t tnum =0;tnum<threads;++tnum){
s = pthread_create(&tinfo[tnum].thread_id, NULL , &th_fft, &tmp[tnum]);
tinfo[tnum].thread_num=tmp[tnum].thread_id_app;
}
for(int8_t tnum =0;tnum < threads;++tnum){
s = pthread_join(tinfo[tnum].thread_id,&res);
}
pthread_attr_destroy(&attr);
for(int8_t tnum = 0 ;tnum < threads; ++tnum){
cout<<"in[tnum]: "<<in[tnum]<<endl;
fftw_free(in[tnum]);
// fftw_free(out[tnum]);
fftw_destroy_plan(tmp[tnum].plan);
}
// fftw_free(in);
// fftw_free(out);
return 0;
}