将pthread与fftw结合使用失败

时间:2015-04-15 14:37:30

标签: pthreads fftw

我正在尝试在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;
 }

0 个答案:

没有答案