sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.33k stars 453 forks source link

Implement parallel f-vector for polytopes #31245

Closed kliem closed 3 years ago

kliem commented 3 years ago

This ticket parallelizes the f-vector for polytopes.

Each thread has its private structure with which it does partial jobs. Depending on the parallelization depth, there is one job per face of fixed codimension (usually 1,2 or 3). After everything has finished, the partial f-vectors will be added.

Actually, every face is visited and thus the code could be modified in the future, to explore other properties of faces then just the dimension. The parallelization seems to work well with at least 40 threads (for computations taking long enough such that this pays off, see https://arxiv.org/pdf/1905.01945.pdf).

Also the algorithm does work in other situations (simplicial complex, lattice of flats of a matroid) and this parallel structure could be used for this as well.

On the downside, sig_on()/sig_off() doesn't work with with multiple threads and has to be replaced by a simple sig_check(). Also raising errors in parallel code results in terrible slow down. Hence the errors are replaced by returning the exception value. In case of a bug there won't be any traceback anymore, but at least also no segmenation fault.

Before:

sage: P = P.base_extend(QQ)                                                                                                                                   
sage: P = P.base_extend(QQ)                                                                                                                                   
sage: Q = P.join(P.polar(in_affine_span=True))                                                                                                                
sage: C = CombinatorialPolyhedron(Q)                                                                                                                          
sage: %time C.f_vector()                                                                                                                                      
CPU times: user 111 ms, sys: 186 µs, total: 111 ms
Wall time: 111 ms
(1, 150, 3990, 25590, 69450, 95402, 69450, 25590, 3990, 150, 1)

sage: P = polytopes.Birkhoff_polytope(5)                                                                                                                      
sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector()                                                                                                                                      
CPU times: user 584 ms, sys: 25 µs, total: 584 ms
Wall time: 583 ms
(1, 120, 5040, 50250, 233400, 631700, 1113700, 1367040, 1220550, 817150, 419225, 167200, 52120, 12600, 2300, 300, 25, 1)

# Using the <simple> version of the algorithm.
sage: P = polytopes.associahedron(['A', 11], backend='normaliz')                                                                                              
sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector()                                                                                                                                      
CPU times: user 37.9 s, sys: 17.2 ms, total: 37.9 s
Wall time: 37.9 s
(1, 208012, 1144066, 2735810, 3730650, 3197700, 1790712, 659736, 157080, 23100, 1925, 77, 1)

After (machine has 4 cores):

sage: P = polytopes.permutahedron(5)                                                                                                                          
sage: P = P.base_extend(QQ)                                                                                                                                   
sage: Q = P.join(P.polar(in_affine_span=True))                                                                                                                
sage: C = CombinatorialPolyhedron(Q)                                                                                                                          
sage: %time C.f_vector(num_threads=1)                                                                                                                         
CPU times: user 107 ms, sys: 0 ns, total: 107 ms
Wall time: 107 ms
(1, 150, 3990, 25590, 69450, 95402, 69450, 25590, 3990, 150, 1)

sage: C = CombinatorialPolyhedron(Q)                                                                                                                          
sage: %time C.f_vector(num_threads=2)                                                                                                                         
CPU times: user 108 ms, sys: 0 ns, total: 108 ms
Wall time: 55.6 ms
(1, 150, 3990, 25590, 69450, 95402, 69450, 25590, 3990, 150, 1)

sage: C = CombinatorialPolyhedron(Q)                                                                                                                          
sage: %time C.f_vector(num_threads=4)                                                                                                                         
CPU times: user 147 ms, sys: 52 µs, total: 147 ms
Wall time: 38.6 ms
(1, 150, 3990, 25590, 69450, 95402, 69450, 25590, 3990, 150, 1)

sage: C = CombinatorialPolyhedron(Q)                                                                                                                          
sage: %time C.f_vector(num_threads=8)                                                                                                                         
CPU times: user 236 ms, sys: 0 ns, total: 236 ms
Wall time: 31.2 ms
(1, 150, 3990, 25590, 69450, 95402, 69450, 25590, 3990, 150, 1)

sage: P = polytopes.Birkhoff_polytope(5)                                                                                                                      
sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=1)                                                                                                                         
CPU times: user 354 ms, sys: 0 ns, total: 354 ms
Wall time: 354 ms
(1, 120, 5040, 50250, 233400, 631700, 1113700, 1367040, 1220550, 817150, 419225, 167200, 52120, 12600, 2300, 300, 25, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=2)                                                                                                                         
CPU times: user 363 ms, sys: 0 ns, total: 363 ms
Wall time: 181 ms
(1, 120, 5040, 50250, 233400, 631700, 1113700, 1367040, 1220550, 817150, 419225, 167200, 52120, 12600, 2300, 300, 25, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=4)                                                                                                                         
CPU times: user 459 ms, sys: 0 ns, total: 459 ms
Wall time: 117 ms
(1, 120, 5040, 50250, 233400, 631700, 1113700, 1367040, 1220550, 817150, 419225, 167200, 52120, 12600, 2300, 300, 25, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=8)                                                                                                                         
CPU times: user 776 ms, sys: 154 µs, total: 776 ms
Wall time: 103 ms
(1, 120, 5040, 50250, 233400, 631700, 1113700, 1367040, 1220550, 817150, 419225, 167200, 52120, 12600, 2300, 300, 25, 1)

# Using the <simple> version of the algorithm.
sage: P = polytopes.associahedron(['A', 11], backend='normaliz')                                                                                              
sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=1)                                                                                                                         
CPU times: user 33.5 s, sys: 0 ns, total: 33.5 s
Wall time: 33.5 s
(1, 208012, 1144066, 2735810, 3730650, 3197700, 1790712, 659736, 157080, 23100, 1925, 77, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=2)                                                                                                                         
CPU times: user 34.4 s, sys: 3.49 ms, total: 34.4 s
Wall time: 17.2 s
(1, 208012, 1144066, 2735810, 3730650, 3197700, 1790712, 659736, 157080, 23100, 1925, 77, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=4)                                                                                                                         
CPU times: user 35.9 s, sys: 15.5 ms, total: 35.9 s
Wall time: 9 s
(1, 208012, 1144066, 2735810, 3730650, 3197700, 1790712, 659736, 157080, 23100, 1925, 77, 1)

sage: C = CombinatorialPolyhedron(P)                                                                                                                          
sage: %time C.f_vector(num_threads=8)                                                                                                                         
CPU times: user 1min 6s, sys: 31.3 ms, total: 1min 6s
Wall time: 8.44 s
(1, 208012, 1144066, 2735810, 3730650, 3197700, 1790712, 659736, 157080, 23100, 1925, 77, 1)

CC: @jplab @LaisRast @stumpc5 @tscrim

Component: geometry

Keywords: parallel f-vector

Author: Jonathan Kliem

Branch/Commit: 4c0a4ae

Reviewer: Travis Scrimshaw

Issue created by migration from https://trac.sagemath.org/ticket/31245

kliem commented 3 years ago

Description changed:

--- 
+++ 
@@ -2,7 +2,7 @@

 Each thread has its private structure with which it does partial jobs. Depending on the parallelization depth, there is one job per face of fixed codimension (usually 1,2 or 3). After everything has finished, the partial f-vectors will be added.

-Actually, every face is visited and thus the code could be modified in the future, to explore other properties of faces then just the dimension. The parallelization seems to work well with at least 40 threads.
+Actually, every face is visited and thus the code could be modified in the future, to explore other properties of faces then just the dimension. The parallelization seems to work well with at least 40 threads (for computations taking long enough such that this pays off, see https://arxiv.org/pdf/1905.01945.pdf).

 Also the algorithm does work in other situations (simplicial complex, lattice of flats of a matroid) and this parallel structure could be used for this as well.
tscrim commented 3 years ago
comment:3

The sig_check() outside the loop is unnecessary:

     cdef size_t j
+    sig_check()
     for j in range(n_faces):
+        sig_check()
         if (is_not_maximal_fused(new_faces, j, algorithm) or  # Step 2
                 is_contained_in_one_fused(new_faces.faces[j], visited_all, algorithm)):  # Step 3
             is_not_new_face[j] = True

Likewise here:

         face_list_t visited_all) nogil except -1:

     cdef size_t output
-    sig_on()
+    sig_check()
     if faces.polyhedron_is_simple:
         output = get_next_level_fused(faces, new_faces, visited_all, <simple> 0)
     else:
         output = get_next_level_fused(faces, new_faces, visited_all, <standard> 0)
-    sig_off()
     return output

 cdef inline size_t bit_rep_to_coatom_rep(face_t face, face_list_t coatoms, size_t *output):

Here you either need the sig_on/sig_off or some more targeted checking. I don't see the point in performing a single check here.

Otherwise LGTM.

tscrim commented 3 years ago

Reviewer: Travis Scrimshaw

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from d051f28 to 0dae7a0

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

0dae7a0remove redundant sig_checks
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from 0dae7a0 to e3bdc61

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

609bd92do not delete all duplicates
5c6cceefix index
e3bdc61pull in 31226 and fix merge conflict
kliem commented 3 years ago

Dependencies: #31226

kliem commented 3 years ago
comment:7

Replying to @tscrim:

The sig_check() outside the loop is unnecessary:

     cdef size_t j
+    sig_check()
     for j in range(n_faces):
+        sig_check()
         if (is_not_maximal_fused(new_faces, j, algorithm) or  # Step 2
                 is_contained_in_one_fused(new_faces.faces[j], visited_all, algorithm)):  # Step 3
             is_not_new_face[j] = True

Likewise here:

         face_list_t visited_all) nogil except -1:

     cdef size_t output
-    sig_on()
+    sig_check()
     if faces.polyhedron_is_simple:
         output = get_next_level_fused(faces, new_faces, visited_all, <simple> 0)
     else:
         output = get_next_level_fused(faces, new_faces, visited_all, <standard> 0)
-    sig_off()
     return output

 cdef inline size_t bit_rep_to_coatom_rep(face_t face, face_list_t coatoms, size_t *output):

Here you either need the sig_on/sig_off or some more targeted checking. I don't see the point in performing a single check here.

Otherwise LGTM.

I removed the redundant sig_checks.

As mentioned, sig_on, sig_off doesn't work well with parallelization. It crashes hard because sig_on, sig_off doesn't appear in correct order anymore.

Wrapping prange in sig_on/sig_off has a large performance penalty (8.45 s -> 9 s).

Currently there is one sig_check before checking that a face is inclusion maximal. One can add more sig checks, which wouldn't affect performance much for large examples, but for the small examples there is a penalty of about 50 percent.

I think the current solution should be fine: The largest thing I ever computed with this algorithm, which took about a month on 40 cores, had 11,665,781 vertices and 162 facets. In this case between the sig_checks A &~ B == 0 is performed for about 2 billion bits. Currently, without intrinsics, I get:

sage: B = Bitset((randint(0,2**20) for _ in range(2**19)))                                                                                                    
sage: %timeit B.issubset(B)                                                                                                                                   
6.18 µs ± 9.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
sage: %timeit B.intersection_update(B)                                                                                                                        
6.02 µs ± 2.72 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

On this rate performing this for 2 billion bits should take about 12 ms. And even if the example has many more coatoms, in the worst case (completely unrealistic, because the dimension is not 1 and more memory is needed for other dimensions and probably for other threads), there are bitwise operations performed twice for the entire RAM. Say, we have 1 TB RAM, this would then take 96 seconds. Okay, that is long, but in any realistic sceanrio it would only take about a second, even with 1 TB RAM.

To sum up, I think the current amount of sig_checks suffices for the next years until more than 1 TB RAM is common (and even then, it doubt that there is an application for such a large example, as it would take forever to compute).

kliem commented 3 years ago
comment:8

Rebased.

I didn't have this ticket here ready when writing #30445.

Eventually, one could also store edges/ridges or any sort of face in parallel. This would also help with applications for simplicial complexes and lattice of flats of manifolds.

But that should be left for another time.


New commits:

6a2a9b4fix merge conflict with develop in particual #30445
928ea60remove redundant allocation
kliem commented 3 years ago

Changed branch from u/gh-kliem/first_parallel_version_of_face_iterator to u/gh-kliem/first_parallel_version_of_face_iterator_reb

kliem commented 3 years ago

Changed commit from e3bdc61 to 928ea60

tscrim commented 3 years ago
comment:9

Thank you. This is quite a nice improvement.

kliem commented 3 years ago
comment:10

Thank you.

vbraun commented 3 years ago
comment:11

On the kucalc buildbot:

[sagelib-9.3.beta6] [1/1] gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wno-unused -O2 -g -march=native -fPIC -I/var/lib/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals -I./sage/data_structures -I./sage/cpython -Isage/cpython -Isage/data_structures -I/var/lib/buildbot/slave/sage_git/build/build/pkgs/sagelib/src -I/var/lib/buildbot/slave/sage_git/build/local/include/python3.9 -I/var/lib/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/numpy/core/include -Ibuild/cythonized -I/var/lib/buildbot/slave/sage_git/build/local/include/python3.9 -c build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c -o build/temp.linux-x86_64-3.9/build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.o -fno-strict-aliasing -DCYTHON_CLINE_IN_TRACEBACK=1 -fopenmp -std=c99
[sagelib-9.3.beta6] In file included from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:660:0:
[sagelib-9.3.beta6] /var/lib/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals/struct_signals.h:45:1: sorry, unimplemented: ‘_Atomic’ with OpenMP
[sagelib-9.3.beta6]  typedef volatile _Atomic int cy_atomic_int;
[sagelib-9.3.beta6]  ^
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__pyx_f_4sage_8geometry_10polyhedron_24combinatorial_polyhedron_13face_iterator_prepare_face_iterator_for_partial_job’:
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9035:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta6]    __pyx_t_2 = ((__pyx_v_structure->current_dimension == (__pyx_v_structure->dimension - __pyx_v_parallelization_depth)) != 0);
[sagelib-9.3.beta6]                                                       ^
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9322:84: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta6]      __pyx_t_1 = (((__pyx_v_parallel_struct->current_job_id[__pyx_v_current_depth]) == -1L) != 0);
[sagelib-9.3.beta6]                                                                                     ^
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9673:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta6]    __pyx_t_1 = ((__pyx_v_structure->current_dimension != ((__pyx_v_structure->dimension - __pyx_v_parallelization_depth) - 1)) != 0);
[sagelib-9.3.beta6]                                                       ^
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__Pyx_InitGlobals’:
[sagelib-9.3.beta6] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:23283:1: warning: ‘PyEval_InitThreads’ is deprecated [-Wdeprecated-declarations]
[sagelib-9.3.beta6]  PyEval_InitThreads();
[sagelib-9.3.beta6]  ^
[sagelib-9.3.beta6] In file included from /var/lib/buildbot/slave/sage_git/build/local/include/python3.9/Python.h:145:0,
[sagelib-9.3.beta6]                  from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:52:
[sagelib-9.3.beta6] /var/lib/buildbot/slave/sage_git/build/local/include/python3.9/ceval.h:130:37: note: declared here
[sagelib-9.3.beta6]  Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void);
[sagelib-9.3.beta6]                                      ^
[sagelib-9.3.beta6] error: command '/usr/bin/gcc' failed with exit code 1
kliem commented 3 years ago
comment:13

This appears to be an issue with python 3.5 to 3.7 according to https://bugs.python.org/issue25150

From this I get that this can be "fixed" by doing this specific module as a C++ extension (or by requiring system python >= 3.8, but that isn't an option for the moment).

I'll check if I can reproduce this with system python 3.7 (need to rebuild first).

kliem commented 3 years ago
comment:14

Actually, that is a problem with cysignals that should be fixed there.

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

baf80detry disabling CYSIGNALS_C_ATOMIC
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from 928ea60 to baf80de

kliem commented 3 years ago
comment:16

According to

https://github.com/sagemath/cysignals/blob/master/src/cysignals/struct_signals.h

and

https://github.com/sagemath/cysignals/blob/master/src/cysignals/cysignals_config.h.in

just undefininig CYSIGNALS_C_ATOMIC should fix this.

tscrim commented 3 years ago
comment:18

Back off to the builbots.

vbraun commented 3 years ago
comment:19

Build fails on various buildbots:

[sagelib-9.3.beta7] [1/1] gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wno-unused -O2 -g -march=native -O2 -g -march=native -fPIC -UCYSIGNALS_C_ATOMIC -I/home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals -I./sage/data_structures -I./sage/cpython -Isage/cpython -I/home/buildbot/slave/sage_git/build/build/pkgs/sagelib/src -I/home/buildbot/slave/sage_git/build/local/include/python3.9 -I/home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/numpy/core/include -Ibuild/cythonized -I/home/buildbot/slave/sage_git/build/local/include/python3.9 -c build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c -o build/temp.linux-x86_64-3.9/build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.o -fno-strict-aliasing -DCYTHON_CLINE_IN_TRACEBACK=1 -fopenmp -std=c99
[sagelib-9.3.beta7] In file included from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:662:0:
[sagelib-9.3.beta7] /home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals/struct_signals.h:45:1: sorry, unimplemented: ‘_Atomic’ with OpenMP
[sagelib-9.3.beta7]  typedef volatile _Atomic int cy_atomic_int;
[sagelib-9.3.beta7]  ^~~~~~~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__pyx_f_4sage_8geometry_10polyhedron_24combinatorial_polyhedron_13face_iterator_prepare_face_iterator_for_partial_job’:
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9037:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]    __pyx_t_2 = ((__pyx_v_structure->current_dimension == (__pyx_v_structure->dimension - __pyx_v_parallelization_depth)) != 0);
[sagelib-9.3.beta7]                                                       ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9324:84: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]      __pyx_t_1 = (((__pyx_v_parallel_struct->current_job_id[__pyx_v_current_depth]) == -1L) != 0);
[sagelib-9.3.beta7]                                                                                     ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9675:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]    __pyx_t_1 = ((__pyx_v_structure->current_dimension != ((__pyx_v_structure->dimension - __pyx_v_parallelization_depth) - 1)) != 0);
[sagelib-9.3.beta7]                                                       ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__Pyx_InitGlobals’:
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:23285:1: warning: ‘PyEval_InitThreads’ is deprecated [-Wdeprecated-declarations]
[sagelib-9.3.beta7]  PyEval_InitThreads();
[sagelib-9.3.beta7]  ^~~~~~~~~~~~~~~~~~
[sagelib-9.3.beta7] In file included from /home/buildbot/slave/sage_git/build/local/include/python3.9/Python.h:145:0,
[sagelib-9.3.beta7]                  from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:54:
[sagelib-9.3.beta7] /home/buildbot/slave/sage_git/build/local/include/python3.9/ceval.h:130:37: note: declared here
[sagelib-9.3.beta7]  Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void);
[sagelib-9.3.beta7]                                      ^~~~~~~~~~~~~~~~~~
[sagelib-9.3.beta7] error: command '/usr/bin/gcc' failed with exit code 1
[sagelib-9.3.beta7] 
[sagelib-9.3.beta7] real    0m3.325s
[sagelib-9.3.beta7] user    0m2.798s
[sagelib-9.3.beta7] sys 0m0.563s
Makefile:2233: recipe for target 'sagelib-no-deps' failed
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1 and set ticket back to needs_review. New commits:

da65d28Revert "try disabling CYSIGNALS_C_ATOMIC"
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from baf80de to da65d28

kliem commented 3 years ago

Changed dependencies from #31226 to #31226, #31455

kliem commented 3 years ago
comment:22

I don't think this is going to happen with 9.3 anymore, if this is waiting on a cysignals patch/update.

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

405ef3eMerge branch 'u/gh-kliem/first_parallel_version_of_face_iterator_reb' of git://trac.sagemath.org/sage into u/gh-kliem/first_parallel_version_of_face_iterator_reb2
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from da65d28 to 405ef3e

kliem commented 3 years ago
comment:24

This bug isn't too hard to reproduce actually:

https://github.com/kliem/sage/runs/2064520070?check_suite_focus=true

Seems to be connected to older GCC.

Replying to @vbraun:

Build fails on various buildbots:

[sagelib-9.3.beta7] [1/1] gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wno-unused -O2 -g -march=native -O2 -g -march=native -fPIC -UCYSIGNALS_C_ATOMIC -I/home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals -I./sage/data_structures -I./sage/cpython -Isage/cpython -I/home/buildbot/slave/sage_git/build/build/pkgs/sagelib/src -I/home/buildbot/slave/sage_git/build/local/include/python3.9 -I/home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/numpy/core/include -Ibuild/cythonized -I/home/buildbot/slave/sage_git/build/local/include/python3.9 -c build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c -o build/temp.linux-x86_64-3.9/build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.o -fno-strict-aliasing -DCYTHON_CLINE_IN_TRACEBACK=1 -fopenmp -std=c99
[sagelib-9.3.beta7] In file included from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:662:0:
[sagelib-9.3.beta7] /home/buildbot/slave/sage_git/build/local/lib/python3.9/site-packages/cysignals/struct_signals.h:45:1: sorry, unimplemented: ‘_Atomic’ with OpenMP
[sagelib-9.3.beta7]  typedef volatile _Atomic int cy_atomic_int;
[sagelib-9.3.beta7]  ^~~~~~~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__pyx_f_4sage_8geometry_10polyhedron_24combinatorial_polyhedron_13face_iterator_prepare_face_iterator_for_partial_job’:
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9037:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]    __pyx_t_2 = ((__pyx_v_structure->current_dimension == (__pyx_v_structure->dimension - __pyx_v_parallelization_depth)) != 0);
[sagelib-9.3.beta7]                                                       ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9324:84: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]      __pyx_t_1 = (((__pyx_v_parallel_struct->current_job_id[__pyx_v_current_depth]) == -1L) != 0);
[sagelib-9.3.beta7]                                                                                     ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:9675:54: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
[sagelib-9.3.beta7]    __pyx_t_1 = ((__pyx_v_structure->current_dimension != ((__pyx_v_structure->dimension - __pyx_v_parallelization_depth) - 1)) != 0);
[sagelib-9.3.beta7]                                                       ^~
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c: In function ‘__Pyx_InitGlobals’:
[sagelib-9.3.beta7] build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:23285:1: warning: ‘PyEval_InitThreads’ is deprecated [-Wdeprecated-declarations]
[sagelib-9.3.beta7]  PyEval_InitThreads();
[sagelib-9.3.beta7]  ^~~~~~~~~~~~~~~~~~
[sagelib-9.3.beta7] In file included from /home/buildbot/slave/sage_git/build/local/include/python3.9/Python.h:145:0,
[sagelib-9.3.beta7]                  from build/cythonized/sage/geometry/polyhedron/combinatorial_polyhedron/face_iterator.c:54:
[sagelib-9.3.beta7] /home/buildbot/slave/sage_git/build/local/include/python3.9/ceval.h:130:37: note: declared here
[sagelib-9.3.beta7]  Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void);
[sagelib-9.3.beta7]                                      ^~~~~~~~~~~~~~~~~~
[sagelib-9.3.beta7] error: command '/usr/bin/gcc' failed with exit code 1
[sagelib-9.3.beta7] 
[sagelib-9.3.beta7] real  0m3.325s
[sagelib-9.3.beta7] user  0m2.798s
[sagelib-9.3.beta7] sys   0m0.563s
Makefile:2233: recipe for target 'sagelib-no-deps' failed
kliem commented 3 years ago

Changed dependencies from #31226, #31455 to #31474

kliem commented 3 years ago
comment:26

This might need more work, as the flag -fopenmp isn't understood everywhere: https://github.com/kliem/sage/pull/40/checks?check_run_id=2076988665

So we should probably check out at configure time, whether our compiler supports this, similar to https://github.com/sagemath/sage-prod/issues/27122.

kliem commented 3 years ago

Changed dependencies from #31474 to #31474, #31499

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

55a4634merge with current develop
6edd48bdefine cython aliases OPENMP_CFLAGS and OPENMP_CXXFLAGS
71f8950fixes to get the aliases to work
b76dc3cadd doctest that shows how use cython.parallel.prange
07cb470Merge branch 'u/gh-kliem/check_openmp_at_configuration' of git://trac.sagemath.org/sage into u/gh-kliem/first_parallel_version_of_face_iterator_reb
27baa07use OPENMP_CFLAGS
7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from 405ef3e to 27baa07

kliem commented 3 years ago
comment:30

Tests are running here:

https://github.com/kliem/sage/pull/40/checks

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from 27baa07 to ae482a4

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. New commits:

a9d3dfesplit to account for multiple arguments
ae482a4Merge branch 'u/gh-kliem/check_openmp_at_configuration' of git://trac.sagemath.org/sage into u/gh-kliem/first_parallel_version_of_face_iterator_reb
kliem commented 3 years ago
comment:33

Thanks again.

vbraun commented 3 years ago
comment:34

Merge conflict

kliem commented 3 years ago

Changed branch from u/gh-kliem/first_parallel_version_of_face_iterator_reb to u/gh-kliem/first_parallel_version_of_face_iterator_reb2

kliem commented 3 years ago

New commits:

2474cccMerge branch 'u/gh-kliem/first_parallel_version_of_face_iterator_reb' of git://trac.sagemath.org/sage into u/gh-kliem/first_parallel_version_of_face_iterator_reb2
kliem commented 3 years ago

Changed commit from ae482a4 to 2474ccc

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Changed commit from 2474ccc to fdbe95f

7ed8c4ca-6d56-4ae9-953a-41e42b4ed313 commented 3 years ago

Branch pushed to git repo; I updated commit sha1. Last 10 new commits:

499af5dremove SAGE_HAVE_OPENMP
7b3da21move to sage_conf.py.in
927291fsimplifications
d71c54aset default
7d3f230more solid check
4f42440sage.env.cython_aliases: Do not fail if one of the listed libraries is not known to pkgconfig
3cb8f90sage.env.cython_aliases: Make module lapack optional; generalize the interface
c3cc31emerge in 31384
70a8791Merge branch 'u/gh-kliem/check_openmp_at_configuration' of git://trac.sagemath.org/sage into u/gh-kliem/first_parallel_version_of_face_iterator_reb2
fdbe95fuse cython.parallel.threadid instead of omp_get_thread_num
kliem commented 3 years ago
comment:37

I'm not sure this was actually a merge conflict.

But even on my laptop with OPENMP support I got missing symbols. Don't exactly understand this.

However, we can't use openmp.omp_get_num_threads for obvious reasons, because it doesn't have to be defined. Instead we should use cython.parallel.threadid, which takes care of this. It is supposed to work, just like prange.

tscrim commented 3 years ago
comment:38

Works for me. Let's try this again...

vbraun commented 3 years ago
comment:39

Merge conflict

mkoeppe commented 3 years ago

Changed branch from u/gh-kliem/first_parallel_version_of_face_iterator_reb2 to u/mkoeppe/first_parallel_version_of_face_iterator_reb2

mkoeppe commented 3 years ago

Changed commit from fdbe95f to 4ae6966

mkoeppe commented 3 years ago

Changed dependencies from #31474, #31499 to #31499