IMP
2.2.0
The Integrative Modeling Platform
IMP Mainpage
All IMP Modules
Related Pages
Modules
Namespaces
Classes
Files
Examples
Indexes
File List
File Members
IMP
All IMP Modules
All IMP Modules and Applications
Argument Index
Class Examples
Design example
Developer Guide
Factory Index
Function Examples
Installation
Introduction
For IMP 2.2
Tools
Dependencies
EMageFit protocol
EMageFit scripts and tools
Integrative docking utility programs
Deprecated List
Modules
Namespaces
Classes
Files
File List
File Members
Examples
Indexes
Class Usage
Class Examples
Class Factories
Function Examples
base/thread_macros.h
Go to the documentation of this file.
1
/**
2
* \file IMP/base/thread_macros.h
3
* \brief Control for OpenMP
4
*
5
* Copyright 2007-2014 IMP Inventors. All rights reserved.
6
*
7
*/
8
9
#ifndef IMPBASE_THREAD_MACROS_H
10
#define IMPBASE_THREAD_MACROS_H
11
12
#include "
threads.h
"
13
#include "
utility_macros.h
"
14
#include "
log_macros.h
"
15
#ifdef _OPENMP
16
#include <
IMP/base/CreateLogContext.h
>
17
#include <omp.h>
18
#endif
19
20
#if defined(IMP_DOXYGEN) || !defined(_OPENMP)
21
22
/** Start a new OpenMP task with the next block passing the
23
list of passed variables.*/
24
#define IMP_TASK(privatev, action, name) action
25
26
/** Start a new OpenMP task with the next block passing the
27
list of passed variables.*/
28
#define IMP_TASK_SHARED(privatev, sharedv, action, name) action
29
30
/** Start a parallel section if one is not already started.
31
*/
32
#define IMP_THREADS(variables, action) action
33
34
/** Pragma for OpenMP */
35
#define IMP_OMP_PRAGMA(x)
36
37
#else
38
39
#define IMP_OMP_PRAGMA(x) IMP_PRAGMA(omp x)
40
41
#define IMP_TASK(privatev, action, name) \
42
if (IMP::base::get_number_of_threads() > 1) { \
43
IMP_OMP_PRAGMA( \
44
task default(none) firstprivate privatev if (omp_in_parallel())) { \
45
IMP::base::CreateLogContext task_context(name); \
46
action; \
47
} \
48
} else { \
49
action; \
50
}
51
52
#define IMP_TASK_SHARED(privatev, sharedv, action, name) \
53
if (IMP::base::get_number_of_threads() > 1) { \
54
IMP_OMP_PRAGMA(task default(none) firstprivate privatev shared \
55
sharedv if (omp_in_parallel())) { \
56
IMP::base::CreateLogContext task_context(name); \
57
action; \
58
} \
59
} else { \
60
action; \
61
}
62
63
#define IMP_THREADS(variables, action) \
64
if (IMP::base::get_number_of_threads() > 1) { \
65
IMP_OMP_PRAGMA(parallel shared variables \
66
num_threads(IMP::base::get_number_of_threads())) { \
67
IMP_PRAGMA(omp single) { \
68
IMP::base::CreateLogContext parallel_context("parallel"); \
69
action; \
70
} \
71
} \
72
} else { \
73
action; \
74
}
75
#endif
76
77
#endif
/* IMPBASE_THREAD_MACROS_H */
log_macros.h
Logging and error reporting support.
CreateLogContext.h
Logging and error reporting support.
utility_macros.h
Various general useful macros for IMP.
threads.h
Control for using multiple threads in IMP.