The attached program is a straightforward implementation of matrix inversion
via the Gauss-Jordan algorithm. The explicitly parallelized version (not
attached) produces exactly the same result for each run independent of the
number of threads. The version parallelized via OpenMP produces incorrect
results for sufficiently large matrices and two or more threads. An example:

$ OMP_NUM_THREADS=1 ./matinv_openmp 180
error = 4.75689e-14; epsilon = 2.22045e-16; error / (epsilon * n) = 1.19018
Error within bounds.
$ OMP_NUM_THREADS=2 ./matinv_openmp 180
error = nan; epsilon = 2.22045e-16; error / (epsilon * n) = nan
Error out of bounds.

I compiled this program as follows:
$ ~/gcc-4.2.3/bin/gcc -Wall -fopenmp -g matinv_openmp.c -static -o
matinv_openmp -lm
$ ~/gcc-4.2.3/bin/gcc -v
Using built-in specs.
Target: x86_64-unknown-linux-gnu
Configured with: /home/bart/software/gcc-4.2.3/configure --disable-nls
--enable-threads=posix --enable-tls --prefix=/home/bart/gcc-4.2.3
Thread model: posix
gcc version 4.2.3


-- 
           Summary: OpenMP: Incorrect result when run with two or more
                    threads
           Product: gcc
           Version: 4.2.3
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: libgomp
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: bart dot vanassche at gmail dot com
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: x86_64-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35517

Reply via email to