1    	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2    	/*                                                                           */
3    	/*                  This file is part of the program and library             */
4    	/*         SCIP --- Solving Constraint Integer Programs                      */
5    	/*                                                                           */
6    	/*  Copyright (c) 2002-2023 Zuse Institute Berlin (ZIB)                      */
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
152