PLASMA
2.4.5
PLASMA - Parallel Linear Algebra for Scalable Multi-core Architectures
Main Page
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
quark.h
Go to the documentation of this file.
1
16
#ifndef QUARK_H
17
#define QUARK_H
18
19
#include <limits.h>
20
#include <stdio.h>
21
22
#if defined( _WIN32 )
23
/* This must be included before INPUT is defined below, otherwise we
24
have a name clash/problem */
25
#include <windows.h>
26
#include <limits.h>
27
#else
28
#include <inttypes.h>
29
#endif
30
31
#include "
quark_unpack_args.h
"
32
33
#if defined(c_plusplus) || defined(__cplusplus)
34
extern
"C"
{
35
#endif
36
37
#ifdef DBGQUARK
38
/* #define DBGPRINTF(str, ...) { fprintf(stderr, "%s:%d: [%s] " str, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } */
39
#define DBGPRINTF(...) { fprintf(stderr, __VA_ARGS__); }
40
#else
41
#define DBGPRINTF(...) if (0) {};
42
#endif
43
44
#define QUARK_SUCCESS 0
45
#define QUARK_ERR -1
46
#define QUARK_ERR_UNEXPECTED -1
47
#define QUARK_ERR_NOT_SUPPORTED -2
48
49
/* A bitmask of 8 bits to to hold region markers */
50
#define QUARK_REGION_BITMASK 0x0000FF
51
#define QUARK_REGION_ALL 0x0FF
52
typedef
enum
{
QUARK_REGION_0
=1<<0,
QUARK_REGION_1
=1<<1,
QUARK_REGION_2
=1<<2,
QUARK_REGION_3
=1<<3,
53
QUARK_REGION_4
=1<<4,
QUARK_REGION_5
=1<<5,
QUARK_REGION_6
=1<<6,
QUARK_REGION_7
=1<<7 }
quark_data_region_t
;
54
typedef
enum
{
QUARK_REGION_L
=
QUARK_REGION_0
|
QUARK_REGION_1
|
QUARK_REGION_2
,
55
QUARK_REGION_D
=
QUARK_REGION_3
|
QUARK_REGION_4
,
56
QUARK_REGION_U
=
QUARK_REGION_5
|
QUARK_REGION_6
|
QUARK_REGION_7
}
quark_ldu_region_t
;
57
58
/* Data items can be: */
59
/* INPUT, OUTPUT, INOUT: these data items create dependencies */
60
/* VALUE: these data items get copied over */
61
/* NODEP: these data items get copied over, and are not used for dependencies */
62
/* SCRATCH: these data items can be allocated (and deallocted) by the scheduler when tasks execute */
63
#define QUARK_DIRECTION_BITMASK 0x000F00
64
typedef
enum
{
QINPUT
=0x100,
OUTPUT
=0x200,
INOUT
=0x300,
VALUE
=0x400,
NODEP
=0x500,
SCRATCH
=0x600}
quark_direction_t
;
65
#define INPUT 0x100
66
67
#define QUARK_VALUE_FLAGS_BITMASK 0xFFF000
68
69
/* Data locality flag; ie keep data on the same core if possible */
70
#define LOCALITY ( 1 << 12 )
71
#define NOLOCALITY 0x00
72
73
/* A data address with a sequence of ACCUMULATOR dependencies will allow the related tasks to be reordered */
74
#define ACCUMULATOR ( 1 << 13 )
75
#define NOACCUMULATOR 0x00
76
77
/* A data address with a sequence of GATHERV dependencies will allow the related tasks to be run in parallel */
78
#define GATHERV ( 1 << 14 )
79
#define NOGATHERV 0x00
80
81
/* The following are task level flags, that can be either provided as additional arguments to the task, or via SET functions */
82
/* The task label; should be provided as a null terminated string */
83
#define TASK_LABEL ( 1 << 15 )
84
#define TASKLABEL TASK_LABEL
/* depreciated label */
85
/* The task color; should be provided as a null terminated string */
86
#define TASK_COLOR ( 1 << 16 )
87
#define TASKCOLOR TASK_COLOR
/* depreciated label */
88
/* The priority of the task, provided as an integer */
89
#define TASK_PRIORITY ( 1 << 17 )
90
/* Lock the task to a specific thread number (0 ... NTHREADS-1), provided as an integer */
91
#define TASK_LOCK_TO_THREAD ( 1 << 18 )
92
/* The sequence pointer to be associated with the task, provided as a pointer */
93
#define TASK_SEQUENCE ( 1 << 19 )
94
/* An integere for the number of threads require */
95
#define TASK_THREAD_COUNT ( 1 << 20 )
96
/* The thread that runs this task should have manual scheduling enabled (1) or disabled (0) */
97
#define THREAD_SET_TO_MANUAL_SCHEDULING ( 1 << 21 )
98
/* Lock the task to a thead mask (0 ... NTHREADS-1) bits long, provided as a character array (byte array) */
99
#define TASK_LOCK_TO_THREAD_MASK ( 1 << 22 )
100
101
/* The range for priority values */
102
#define QUARK_TASK_MIN_PRIORITY 0
103
#define QUARK_TASK_MAX_PRIORITY INT_MAX
104
105
/* Definition of structure holding scheduler information */
106
typedef
struct
quark_s
Quark
;
107
108
/* Structure holding task information */
109
typedef
struct
quark_task_s
Quark_Task
;
110
111
/* Create a type for setting task flags */
112
struct
quark_task_flags_s
{
113
int
task_priority
;
114
int
task_lock_to_thread
;
115
char
*
task_color
;
116
char
*
task_label
;
117
void
*
task_sequence
;
118
int
task_thread_count
;
119
int
thread_set_to_manual_scheduling
;
120
unsigned
char
*
task_lock_to_thread_mask
;
121
};
122
123
typedef
struct
quark_task_flags_s
Quark_Task_Flags
;
124
/* Static initializer for Quark_Task_Flags_t */
125
#define Quark_Task_Flags_Initializer { (int)0, (int)-1, (char *)NULL, (char *)NULL, (void *)NULL, (int)1, (int)-1, (unsigned char *)NULL }
126
127
/* Setup scheduler data structures, assumes threads are managed seperately */
128
Quark
*
QUARK_Setup
(
int
num_threads);
129
130
/* Setup scheduler data structures, spawn worker threads, start the workers working */
131
Quark
*
QUARK_New
(
int
num_threads);
132
133
/* Add a task, called by the master process (thread_rank 0) */
134
unsigned
long
long
QUARK_Insert_Task
(
Quark
* quark,
void
(*
function
) (
Quark
*),
Quark_Task_Flags
*task_flags, ...);
135
136
/* Main work loop, called externally by everyone but the master
137
* (master manages this internally to the insert_task and waitall
138
* routines). Each worker thread can call work_main_loop( quark,
139
* thread_rank), where thread rank is 1...NUMTHREADS ) */
140
void
QUARK_Worker_Loop
(
Quark
*quark,
int
thread_rank);
141
142
/* Finish work and return. Workers do not exit */
143
void
QUARK_Barrier
(
Quark
* quark);
144
145
/* Just wait for current tasks to complete, the scheduler and
146
* strutures remain as is... should allow for repeated use of the
147
* scheduler. The workers return from their loops.*/
148
void
QUARK_Waitall
(
Quark
* quark);
149
150
/* Delete scheduler, shutdown threads, finish everything, free structures */
151
void
QUARK_Delete
(
Quark
* quark);
152
153
/* Free scheduling data structures */
154
void
QUARK_Free
(
Quark
* quark);
155
156
/* Cancel a specific task */
157
int
QUARK_Cancel_Task
(
Quark
*quark,
unsigned
long
long
taskid);
158
159
/* Returns a pointer to the list of arguments, used when unpacking the
160
arguments; Returna a pointer to icl_list_t, so icl_list.h will need
161
bo included if you use this function */
162
void
*
QUARK_Args_List
(
Quark
*quark);
163
164
/* Returns the rank of a thread in a parallel task */
165
int
QUARK_Get_RankInTask
(
Quark
*quark);
166
167
/* Return a pointer to an argument. The variable last_arg should be
168
NULL on the first call, then each subsequent call will used
169
last_arg to get the the next argument. */
170
void
*
QUARK_Args_Pop
(
void
*args_list,
void
**last_arg);
171
172
/* Utility function returning rank of the current thread */
173
int
QUARK_Thread_Rank
(
Quark
*quark);
174
175
/* Packed task interface */
176
/* Create a task data structure to hold arguments */
177
Quark_Task
*
QUARK_Task_Init
(
Quark
* quark,
void
(*
function
) (
Quark
*),
Quark_Task_Flags
*task_flags );
178
179
/* Add (or pack) the arguments into a task data structure (make sure of the correct order) */
180
void
QUARK_Task_Pack_Arg
(
Quark
*quark,
Quark_Task
*task,
int
arg_size,
void
*arg_ptr,
int
arg_flags );
181
182
/* Insert the packed task data strucure into the scheduler for execution */
183
unsigned
long
long
QUARK_Insert_Task_Packed
(
Quark
* quark,
Quark_Task
*task );
184
185
/* Unsupported function for debugging purposes; execute task AT ONCE */
186
unsigned
long
long
QUARK_Execute_Task
(
Quark
* quark,
void
(*
function
) (
Quark
*),
Quark_Task_Flags
*task_flags, ...);
187
188
/* Get the label (if any) associated with the current task; used for printing and debugging */
189
char
*
QUARK_Get_Task_Label
(
Quark
*quark);
190
191
/* Method for setting task flags */
192
Quark_Task_Flags
*
QUARK_Task_Flag_Set
(
Quark_Task_Flags
*flags,
int
flag, intptr_t val );
193
194
/* Type for task sequences */
195
typedef
struct
Quark_sequence_s
Quark_Sequence
;
196
197
/* Create a seqeuence structure, to hold sequences of tasks */
198
Quark_Sequence
*
QUARK_Sequence_Create
(
Quark
*quark );
199
200
/* Called by worker, cancel any pending tasks, and mark sequence so that it does not accept any more tasks */
201
int
QUARK_Sequence_Cancel
(
Quark
*quark,
Quark_Sequence
*sequence );
202
203
/* Destroy a sequence structure, cancelling any pending tasks */
204
Quark_Sequence
*
QUARK_Sequence_Destroy
(
Quark
*quark,
Quark_Sequence
*sequence );
205
206
/* Wait for a sequence of tasks to complete */
207
int
QUARK_Sequence_Wait
(
Quark
*quark,
Quark_Sequence
*sequence );
208
209
/* Get the sequence information associated the current task/worker, this was provided when the tasks was created */
210
Quark_Sequence
*
QUARK_Get_Sequence
(
Quark
*quark);
211
212
/* Get the priority associated the current task/worker */
213
int
QUARK_Get_Priority
(
Quark
*quark);
214
215
/* Get information associated the current task and worker thread;
216
* Callable from within a task, since it works on the currently
217
* executing task */
218
intptr_t
QUARK_Task_Flag_Get
(
Quark
*quark,
int
flag );
219
220
/* Enable and disable DAG generation via API. Only makes sense after
221
* a sync, such as QUARK_Barrier. */
222
void
QUARK_DOT_DAG_Enable
(
Quark
*quark,
int
boolean_value );
223
224
/* Get the number_th bit in a bitset (unsigned char *); useful for QUARK_LOCK_TO_THREAD_MASK flag */
225
static
inline
int
QUARK_Bit_Get(
unsigned
char
*
set
,
int
number)
226
{
227
set
+= number / 8;
228
return
(*
set
& (1 << (7-(number % 8)))) != 0;
/* 0 or 1 */
229
}
230
231
/* Set the number_th bit in a bitset (unsigned char *) to value (0 or 1); useful for QUARK_LOCK_TO_THREAD_MASK flag */
232
static
inline
void
QUARK_Bit_Set(
unsigned
char
*
set
,
int
number,
int
value)
233
{
234
set
+= number / 8;
235
if
(value)
236
*
set
|= 1 << (7-(number % 8));
/* set bit */
237
else
*
set
&= ~(1 << (7-(number % 8)));
/* clear bit */
238
239
}
240
241
#if defined(c_plusplus) || defined(__cplusplus)
242
}
243
#endif
244
245
#endif
/* QUARK.H */
plasma_2.4.5
quark
quark.h
Generated on Mon Jul 9 2012 12:45:03 for PLASMA by
1.8.1