LadaF/PoisFFT

Some tests failed when with OpenMP

Closed this issue · 8 comments

Compiled the library using

scons comp=intel openmp=yes

then the tests

scons comp=intel openmp=yes test

And these tests failed

$ ./c_testpoisson 
FAIL, residuum 2.815387

$ ./cc_testpoisson 
FAIL, residuum2.81539

$ ./testpoisson
 ----
 3D  |Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|
 Spectral FAIL
 Spectral residuum:  0.141491213006055     
 FD2 FAIL
 Finite difference 2 residuum:   1.92554165807776     

 ----
 3D  |Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|
 Spectral FAIL
 Spectral residuum:  0.132820078333749     
 FD2 FAIL
 Finite difference 2 residuum:   1.95833611599937     

 ----
 3D  |Neumann regular|Neumann regular|Neumann regular|Neumann regular|Neumann regular|Neumann regular|
 FD2 FAIL
 Finite difference 2 residuum:   2.52419027322218     

 ----
 3D  |Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|
 FD2 FAIL
 Finite difference 2 residuum:   2.48632335787074  

Other tests in testpoisson were passed.

Recompiled the tests, but not the library, without OpenMP

scons comp=intel openmp=no test

And then all tests were passed, for all three interfaces.

LadaF commented

Thank you, I will have a look.
Dne 28. 5. 2016 9:08 napsal uživatel "Praxist" notifications@github.com:

Compiled the library using

scons comp=intel openmp=yes

then the tests

scons comp=intel openmp=yes test

And these tests failed

$ ./c_testpoisson
FAIL, residuum 2.815387

$ ./cc_testpoisson
FAIL, residuum2.81539

$ ./testpoisson


3D |Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|Dirichlet regular|
Spectral FAIL
Spectral residuum: 0.141491213006055
FD2 FAIL
Finite difference 2 residuum: 1.92554165807776


3D |Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|Dirichlet staggered|
Spectral FAIL
Spectral residuum: 0.132820078333749
FD2 FAIL
Finite difference 2 residuum: 1.95833611599937


3D |Neumann regular|Neumann regular|Neumann regular|Neumann regular|Neumann regular|Neumann regular|
FD2 FAIL
Finite difference 2 residuum: 2.52419027322218


3D |Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|Neumann staggered|
FD2 FAIL
Finite difference 2 residuum: 2.48632335787074

Other tests in testpoisson were passed.

Recompiled the tests, but not the library, without OpenMP

scons comp=intel openmp=no test

And then all tests were passed, for all three interfaces.


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
#3, or mute the thread
https://github.com/notifications/unsubscribe/AAskEZhXajw6Eiqy51010zLapqIowXYkks5qF_gMgaJpZM4IpBiy
.

LadaF commented

Could you report the compiler version you use?

$ ifort -v
ifort version 16.0.2

I tried gcc with OpenMP just now. And it worked.
So I guess it is a compiler problem.

LadaF commented

There was a serious bug in Intel v. 15 which prevented even a successful compilation. I will try to have a look with v. 16, but it can be again a compiler bug. There are other OpenMP bugs in Intel compilers and they don't seem to be interested in fixing them https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/509671

I see. I as well encountered some strange behaviors before using Intel OpenMP. Thanks.

LadaF commented

I suspect it is a clash of OpenMP in the Intel compiler and GCC OpenMP used in your FFTW3 library. You may try to use FFTW compiled for Intel compilers and see. When the program is run with OMP_NUM_THREADS=1 the result is correct.

No luck. make check for FFTW3 ran successfully. But PoisFFT tests still failed.
However, I don't think I really need OpenMP feature for now.
In my case, there are many independent poisson equations. It should be more efficient distributing them among cores than solving them one by one, right?

LadaF commented

I believe the point is in the incompatibility between FFTW compiled by GCC and PoisFFT compiled by Intel. If you have a problem and your FFTW is compiled with Intel, please report it.

Yes, I think if you have multiple transforms it is better to distribute them. You should be able to re-use a common PoisFFT object. Pass nthreads=1 to be sure.