ThreadSafe использовать FFTW3? - PullRequest
0 голосов
/ 29 мая 2020

Я пишу функцию для получения преобразования Фурье:

void test(std::vector<double>& vFactorYield) {
    int len = vFactorYield.size();
    std::vector<double> vAmplitude;
    vAmplitude.reserve(len/2+1);
    double *in = nullptr;
    fftw_complex *out = nullptr;
    in  = (double *)fftw_malloc(sizeof(double) * len);
    out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);      
    fftw_plan p = fftw_plan_dft_r2c_1d(len, in, out, FFTW_ESTIMATE);
    fftw_execute(p);
    fftw_destroy_plan(p);
    fftw_free(in);
    fftw_free(out);
}

и в основном. cpp:

int main(){
  std::vector<int> v1;
  std::vector<int> v2;
  std::thread t1(test,v1)
  std::thread t2(test,v2);
  t1.join();
  t2.join();
}

Получу ли я правильный результат? Раз уж я заметил DO C (http://www.fftw.org/fftw3.pdf) говорит:

«единственная поточно-безопасная процедура в FFTW - это fftw_execute (и его варианты newarray). Все остальные подпрограммы (например, планировщик ) следует вызывать только из одного потока за раз. "

Итак, насколько я понимаю, функция fftw_execute (fftw_plan) будет использовать все ядра для вычислений. Поэтому, чтобы избежать потенциальной угрозы, в моей основной функции , Надо уточнить "fftw_make_planner_thread_safe (void)"

...