【问题标题】:FFTW3 in Intel compiler: Anything special?英特尔编译器中的 FFTW3:有什么特别之处吗?
【发布时间】:2021-07-19 23:28:07
【问题描述】:

这段代码的 sn-p 读入一些未格式化的双精度数据,并在其上返回一个真正的 FFTW:

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

#include <fcntl.h>
#include <unistd.h>

int main() {

   int i, fdin;
   int count=128;
   static fftw_plan fplan=0;
   double alldata[2][count];

   fdin = open("rand_walk.dat", O_RDONLY);
   read(fdin, alldata[0], sizeof(double)*count);

   fplan = fftw_plan_r2r_1d(count, alldata[0],
                            alldata[1], FFTW_R2HC, FFTW_ESTIMATE);
   fftw_execute_r2r(fplan, alldata[0], alldata[1]);

   printf("%lf\n",alldata[0][0]);
   printf("%lf\n",alldata[1][10]);

   return 0;

}

在 GNU 或 Cray 下编译时它工作得很好。在 Intel 下编译时,它运行时没有任何错误消息,但输出数组 (alldata[1]) 用零填充。显然,我不明白英特尔与 FFTW3 的关系。有谁知道那可能是什么?顺便说一句,在我必须使用的平台上切换到 FFTW2 不是一个选项。

【问题讨论】:

  • 请从正确的错误处理开始。您确定输入文件已正确打开吗?你永远不会检查它。
  • @EugeneSh。正如我经常被要求的那样,我正试图使显示的代码尽可能短。 FWIW,我已经测试过,文件打开并正确读取。
  • 这很好,但您应该确保呈现的代码没有引入原始代码没有的问题。不幸的是,我们不能“相信”代码中没有明确存在的东西,它不是个人的,而是基于许多其他问题的经验。这也应该是minimal reproducible example,也就是说,如果您声称 (alldata[1]) 用零填充,那么请显示显示该数组全为零的代码。
  • 举个简单的例子,只需硬编码一个数组。非零输入必须有非零输出很简单,因此只需设置alldata[0][0] = 1.0; 就足够了。

标签: c intel fftw icc


【解决方案1】:

我试过了

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

#include <fcntl.h>
#include <unistd.h>

int main() {

   int i, fdin;
   int count=2;
   static fftw_plan fplan=0;
   double alldata[2][2]={1,1,1,1};
 fplan = fftw_plan_r2r_1d(count, alldata[0],
                            alldata[1], FFTW_R2HC, FFTW_ESTIMATE);
   fftw_execute_r2r(fplan, alldata[0], alldata[1]);

   printf("%lf\n",alldata[0][0]);
   printf("%lf\n",alldata[1][0]);

   return 0;

}

并使用以下命令编译: icpc -mkl -I"${MKLROOT}/include/fftw" sample.cpp 并得到 1.0 和 1.0。结果。

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多