Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Fortran中的OpenMP:对数据类型的更改?_Types_Fortran_Openmp - Fatal编程技术网

Types Fortran中的OpenMP:对数据类型的更改?

Types Fortran中的OpenMP:对数据类型的更改?,types,fortran,openmp,Types,Fortran,Openmp,我有一个程序,我曾经编译有或没有OpenMP。即使我在运行它时使用一个输入文件进行转换,并且OMP_NUM_THREADS设置为1,生成的ASCII文件也不同于我运行程序时得到的ASCII文件,该程序是在没有OpenMP的情况下编译的!我真的不明白。。。linux中的“diff”将每一行打印为不同的,但是当我自己查看文件并比较单个浮点值时,我自己没有看到任何差异。 该文件看起来像: 0.949566E+00 0.945844E+00 0.942125E+00 0.938410E+00 0.934

我有一个程序,我曾经编译有或没有OpenMP。即使我在运行它时使用一个输入文件进行转换,并且OMP_NUM_THREADS设置为1,生成的ASCII文件也不同于我运行程序时得到的ASCII文件,该程序是在没有OpenMP的情况下编译的!我真的不明白。。。linux中的“diff”将每一行打印为不同的,但是当我自己查看文件并比较单个浮点值时,我自己没有看到任何差异。 该文件看起来像:

0.949566E+00 0.945844E+00 0.942125E+00 0.938410E+00 0.934698E+00 0.930989E+00 0.927285E+00 0.923584E+00 0.919888E+00 0.916196E+00 0.912508E+00 0.908826E+00 0.905149E+00 0.901476E+00 0.897810E+00 0.894149E+00 0.890493E+00 0.886845E+00 0.883202E+00 0.879565E+00

等等。。。(当前以单精度运行!)。。。
OpenMP中是否有任何内部数据更改或相关建议?

OpenMP可能会更改可能影响结果的计算顺序,但不会更改内部数据布局或精度。如果您在打印这些值的文件级别上看到了差异,那么我建议尝试使用-b进行diff或使用-b进行cmp(并使用-b查看字节值)。ejd完全正确地认识到,使用omp进行编译可以改变事情——编译器无法跨并行段边界进行优化,例如,但我对这一点更感兴趣:“
diff
在linux中打印出的每一行都是不同的,但当我自己查看文件并比较单个浮点值时,我自己看不到任何差异。”这让我觉得它像是一个格式/空白问题。您能逐字向我们展示两行不匹配的代码和输出代码吗?常见的问题是不正确的作用域和数据争用。另一件可以改变结果的事情是,如果您使用的是reduce子句。很好的一点是,通过去掉指令中的“$”可以很容易地删除指令,这使它成为一个注释。删除指令并运行,直到将其限制为导致问题的指令。然后,您必须查看变量范围,看看是否存在问题。另外,请记住,仅仅因为值不同并不意味着您实际存在问题(同样的情况也可能适用于串行代码)。也许,您可以发布一些实际的代码,而不是对其进行描述???至于您的以下问题,您列出的任何内容都可能产生影响。OpenMP对子例程中的变量有一组“默认”规则。它们可以共享,这取决于您如何声明它们,这可能会导致问题。对于来自一个线程的I/O,您不能毫无问题地从多个线程读取/写入文件。如果您希望工作正常,或者需要在I/O周围“锁定”,则每个线程都需要有不同的单元号和不同的文件。对于并行工作共享do中的循环,它们由分配了外部工作块的线程运行。