Scippy

SCIP

Solving Constraint Integer Programs

def_openmp.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program and library */
4 /* SCIP --- Solving Constraint Integer Programs */
5 /* */
6 /* Copyright 2002-2022 Zuse Institute Berlin */
7 /* */
8 /* Licensed under the Apache License, Version 2.0 (the "License"); */
9 /* you may not use this file except in compliance with the License. */
10 /* You may obtain a copy of the License at */
11 /* */
12 /* http://www.apache.org/licenses/LICENSE-2.0 */
13 /* */
14 /* Unless required by applicable law or agreed to in writing, software */
15 /* distributed under the License is distributed on an "AS IS" BASIS, */
16 /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17 /* See the License for the specific language governing permissions and */
18 /* limitations under the License. */
19 /* */
20 /* You should have received a copy of the Apache-2.0 license */
21 /* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
22 /* */
23 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24 
25 /**@file def_openmp.h
26  * @ingroup TASKINTERFACE
27  * @brief wrappers for OpenMP defines
28  * @author Stephen J. Maher
29  */
30 
31 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
32 
33 #ifndef __DEF_OPENMP_H__
34 #define __DEF_OPENMP_H__
35 
36 #define STR(x) #x
37 #define STRINGIFY(x) STR(x)
38 #define CONCATENATE(x, y) x y
39 #define CONCATPARENTH(x, y) x ( y )
40 
41 #define TPI_NULL NULL
42 
43 #ifdef TPI_OMP
44 
45 #define TPI_PRAGMA_CLAUSE(directive, clause) _Pragma( STRINGIFY( CONCATENATE( directive, clause ) ) )
46 #define TPI_PRAGMA(directive) _Pragma( STRINGIFY( directive ) )
47 #define TPI_PRAGMA_PARENTH(directive, var) _Pragma( STRINGIFY( CONCATPARENTH( directive, var ) ) )
48 
49 #else
50 
51 #define TPI_PRAGMA_CLAUSE(directive, clause)
52 #define TPI_PRAGMA(directive)
53 #define TPI_PRAGMA_PARENTH(directive, var)
54 
55 #endif
56 
57 
58 #define TPI_FOR_CLAUSE(clause) TPI_PRAGMA_CLAUSE( TPI_DIR_FOR, clause )
59 #define TPI_FOR TPI_PRAGMA( TPI_DIR_FOR )
60 #define TPI_PARA_CLAUSE(clause) TPI_PRAGMA_CLAUSE( TPI_DIR_PARA, clause )
61 
62 #define TPI_PARA_CLAUSE_SHARED(priv, clause) TPI_PRAGMA_CLAUSE( TPI_DIR_PARA, \
63  TPI_CLAUSE_DEFAULT( shared ) \
64  TPI_CLAUSE_PRIVATE( (priv) ) clause )
65 
66 #define TPI_PARA_SHARED TPI_PRAGMA_CLAUSE( TPI_DIR_PARA, \
67  TPI_CLAUSE_DEFAULT( shared ) )
68 
69 #define TPI_PARA_SHARED_PRIVATE(priv) TPI_PRAGMA_CLAUSE( TPI_DIR_PARA, \
70  TPI_CLAUSE_DEFAULT( shared ) \
71  TPI_CLAUSE_PRIVATE( ( priv ) ) )
72 
73 #define TPI_PARA_CLAUSE_NONE(share, priv, clause) TPI_PRAGMA_CLAUSE( TPI_DIR_PARA, \
74  TPI_CLAUSE_DEFAULT( (none) ) \
75  TPI_CLAUSE_SHARED( (share) ) \
76  TPI_CLAUSE_PRIVATE( (priv) ) clause )
77 
78 #define TPI_PARA TPI_PRAGMA( TPI_DIR_PARA )
79 #define TPI_CRITICAL(var) TPI_PRAGMA_PARENTH( TPI_DIR_CRITICAL, var)
80 #define TPI_MASTER TPI_PRAGMA( TPI_DIR_MASTER )
81 #define TPI_WAIT TPI_PRAGMA( TPI_DIR_WAIT )
82 #define TPI_ORDERED TPI_PRAGMA( TPI_DIR_ORDERED )
83 #define TPI_SINGLE TPI_PRAGMA( TPI_DIR_SINGLE )
84 #define TPI_CLAUSE_SINGLE(clause) TPI_PRAGMA_CLAUSE( TPI_DIR_SINGLE, clause )
85 #define TPI_TASK TPI_PRAGMA( TPI_DIR_TASK )
86 #define TPI_TASK_SHARED TPI_PRAGMA_CLAUSE( TPI_DIR_TASK, \
87  TPI_CLAUSE_DEFAULT(shared) )
88 #define TPI_CLAUSE_TASK(clause) TPI_PRAGMA_CLAUSE( TPI_DIR_TASK, clause )
89 #define TPI_TASKWAIT TPI_PRAGMA( TPI_DIR_TASKWAIT )
90 
91 
92 /* OpenMP pragma directives */
93 #define TPI_DIR_PARA omp parallel
94 #define TPI_DIR_FOR omp for
95 #define TPI_DIR_CRITICAL omp critical
96 #define TPI_DIR_MASTER omp master
97 #define TPI_DIR_WAIT omp barrier
98 #define TPI_DIR_ORDERED omp ordered
99 #define TPI_DIR_TASK omp task
100 #define TPI_DIR_SINGLE omp single
101 #define TPI_DIR_TASKWAIT omp taskwait
102 
103 
104 /* OpenMP clauses */
105 #define TPI_CLAUSE_PRIVATE(var) CONCATENATE( private, var )
106 #define TPI_CLAUSE_FSTPRIVATE(var) CONCATENATE( firstprivate, var )
107 #define TPI_CLAUSE_LSTPRIVATE(var) CONCATENATE( lastprivate, var )
108 #define TPI_CLAUSE_CPYPRIVATE(var) CONCATENATE( copyprivate, var )
109 #define TPI_CLAUSE_NOWAIT nowait
110 #define TPI_CLAUSE_SHARED(var) CONCATENATE( shared, var )
111 #define TPI_CLAUSE_DEFAULT(var) CONCATPARENTH( default, var )
112 /* The reduce clause requires op as either an operator or intrinsic procedure.
113  * Operators: +, *, .and., .or., .eqv., .neqv.
114  * intrinsic procedures: max, min, iand, ior, or ieor*/
115 #define TPI_CLAUSE_REDUCE(op, var) CONCATENATE( reduction, CONCATENATE( CONCATENATE( op, : ), var ) )
116 #define TPI_CLAUSE_ORDERED ordered
117 #define TPI_CLAUSE_IF(var) CONCATENATE( if, var )
118 #define TPI_CLAUSE_NUMTHREADS(var) CONCATENATE( num_threads, var )
119 #define TPI_CLAUSE_SCHEDULE(type) CONCATENATE( schedule, type )
120 #define TPI_CLAUSE_SCHEDULE_CHUNK(type, chunk) CONCATENATE( schedule, CONCATPARENTH( type, chunk ) )
121 #define TPI_CLAUSE_COPYIN(var) CONCATENATE( copyin, var )
122 #define TPI_CLAUSE_FINAL(var) CONCATENATE( final, var )
123 #define TPI_CLAUSE_UNTIED untied
124 #define TPI_CLAUSE_MERGEABLE mergeable
125 #define TPI_CLAUSE_DEPEND(type, var) CONCATENATE( depend, CONCATENATE( CONCATENATE( type, : ), var ) )
126 #define TPI_CLAUSE_PRIORITY(var) CONCATENATE( priority, var )
127 
128 
129 
130 #define TPI_SHARED_DATA(name, members) struct TPI_Shared_Data { \
131  members \
132  } name;
133 
134 #define TPI_PRIVATE_DATA(name, members) struct TPI_Private_Data { \
135  members \
136  } name;
137 
138 #define TPI_FSTPRIVATE_DATA(name, members) struct TPI_FirstPrivate_Data { \
139  members \
140  } name;
141 
142 #define TPI_LSTPRIVATE_DATA(name, members) struct TPI_LastPrivate_Data { \
143  members \
144  } name;
145 
146 #define TPI_COPYIN_DATA(name, members) struct TPI_CopyIn_Data { \
147  members \
148  } name;
149 
150 
151 #endif