On 25.01.22 10:19, Thomas Schwinge wrote:
I am trying to figure out if the problem you observed
is a general one or just specific to fortran testcase.
So, unless the '-fsanitize=thread' issues are bogus -- unlikely ;-) -- it
seems a latent issue generally, now fatal with
'libgomp.fortran/allocate-1.f90'.
There is one known issue with libgomp and TSAN (-fsanitize=thread)
that I tend to forget about :-(
That's according to Jakub, who wrote a while ago:
"TSAN doesn't understand what libgomp is doing, unless built with
--disable-linux-futex"
However, I now tried to disable futex and still get the following.
(First result for libgomp.c-c++-common/allocate-1.c).
On the other hand, I have the feeling that the configure option is
a no op for libgomp. This can also be seen in the configure.ac script,
which only for libstdc++ uses the result and the others have a no-op
call to 'true' (alias ':'):
libgomp/configure.ac:GCC_LINUX_FUTEX(:)
libitm/configure.ac:GCC_LINUX_FUTEX(:)
libstdc++-v3/configure.ac:GCC_LINUX_FUTEX([AC_DEFINE(HAVE_LINUX_FUTEX, 1,
[Define if futex syscall is available.])])
(The check is not completely pointless as some checks are still done;
e.g. 'SYS_gettid and SYS_futex required'.)
(TSAN did find issues in libgomp in the past, however. But those
habe been fixed.)
Thus, there might or might not be an issue when TSAN reports one.
* * *
Glancing at the Fortran testcase, I noted the following,
which probably does not cause the problems. But still,
I want to mention it:
!$omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
if (x /= 42) then
stop 1
end if
v(1) = 7
if ( (and(fl, 2) /= 0) .and. &
((is_64bit_aligned(x) == 0) .or. &
(is_64bit_aligned(y) == 0) .or. &
(is_64bit_aligned(v(1)) == 0))) then
stop 2
end if
If one compares this with the C/C++ testcase, I note that there
is a barrier before the alignment check in C/C++ but not in
Fortran. Additionally, 'v(1) = 7' is set twice and the
alignment check happens earlier than in C/C++. Not that that
should really matter, but I just saw it.
In C/C++:
int v[x], w[x];
...
v[0] = 7;
v[41] = 8;
In Fortran:
integer, dimension(x) :: v
...
v(1) = 7
v(41) = 8
where 'x == 42'. The Fortran version is not really wrong, but I think
the idea is to set the first and last array element - and that's here
v(42) and not v(41).
BTW: Fortran permits to specify a different lower bound. When converting
C/C++ testcases, it can be useful to use the same lower bound also in
Fortran: integer :: v(0:x-1) (or: 'integer, dimension(0:x-1) :: v')
uses then 0 ... 41 for the indices instead of 1 ... 42.
But one has to be careful as Fortran uses the upper bound and C uses the
number of elements. (Same with OpenMP array sections in Fortran vs. C.)
Tobias
PS: The promised data-race warning:
==================
WARNING: ThreadSanitizer: data race (pid=4135381)
Read of size 8 at 0x7ffc0888bdc0 by thread T10:
#0 foo._omp_fn.2 libgomp.c-c++-common/allocate-1.c:47 (a.out+0x402c05)
#1 gomp_thread_start ../../../repos/gcc/libgomp/team.c:129
(libgomp.so.1+0x1e5ed)
Previous write of size 8 at 0x7ffc0888bdc0 by main thread:
#0 foo._omp_fn.1 libgomp.c-c++-common/allocate-1.c:47 (a.out+0x402aee)
#1 GOMP_teams_reg ../../../repos/gcc/libgomp/teams.c:51
(libgomp.so.1+0x3638c)
#2 main libgomp.c-c++-common/allocate-1.c:366 (a.out+0x40273e)
Location is stack of main thread.
Location is global '<null>' at 0x000000000000 ([stack]+0x1ddc0)
Thread T10 (tid=4135398, running) created by main thread at:
#0 pthread_create
../../../../repos/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:1001
(libtsan.so.2+0x62c76)
#1 gomp_team_start ../../../repos/gcc/libgomp/team.c:858
(libgomp.so.1+0x1ec18)
#2 main libgomp.c-c++-common/allocate-1.c:366 (a.out+0x40273e)
SUMMARY: ThreadSanitizer: data race libgomp.c-c++-common/allocate-1.c:47 in
foo._omp_fn.2
==================
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht
München, HRB 106955