source: soft/giet_vm/applications/rosenfeld/include/mca.h @ 821

Last change on this file since 821 was 821, checked in by meunier, 8 years ago
  • Added several versions of rosenfeld: { SLOW, FAST } x { FEATURES, NO_FEATURES }
  • Added native linux compilation support
  • Added a script to check results natively
  • Started to refactor nrc code
File size: 3.4 KB
Line 
1/* ------------- */
2/* --- MCA.h --- */
3/* ------------- */
4
5/*
6 * Copyright (c) 2016 Lionel Lacassagne, LIP6, UPMC, CNRS
7 * Init  : 2016/03/03
8 */
9
10// Multi/Many Cores Connected Component Computation en Analysis
11// extension of pixel-based and run-based algorithm to manycores with distributed memory
12
13#ifndef __MCA_H__
14#define __MCA_H__
15
16#include "ecc_features.h"
17
18#include "nrc_os_config.h"
19
20#if TARGET_OS == GIETVM
21    #include <user_lock.h>
22    #include <user_barrier.h>
23#elif TARGET_OS == LINUX
24    #include <pthread.h>
25#endif
26
27
28// QM : using mutex lock instead of mutexlock,
29// because apparently mutexlocks cause a bug in valgrind
30// (solved but the installed version is not recent enough)
31// cf. https://bugs.kde.org/show_bug.cgi?id=336435
32pthread_mutex_t print_lock;
33
34#define MCA_VERBOSE0(X) ({                 \
35        pthread_mutex_lock(&print_lock);   \
36        X;                                 \
37        pthread_mutex_unlock(&print_lock); \
38        })
39#define MCA_VERBOSE1(X) ({                 \
40        pthread_mutex_lock(&print_lock);   \
41        X;                                 \
42        pthread_mutex_unlock(&print_lock); \
43        })
44#define MCA_DISPLAY0(X) ({                 \
45        pthread_mutex_lock(&print_lock);   \
46        X;                                 \
47        pthread_mutex_unlock(&print_lock); \
48        })
49#define MCA_DISPLAY1(X) ({                 \
50        pthread_mutex_lock(&print_lock);   \
51        X;                                 \
52        pthread_mutex_unlock(&print_lock); \
53        })
54
55
56#define MCA_VERBOSE2(X)
57/*
58#define MCA_VERBOSE2(X) ({                 \
59        pthread_mutex_lock(&print_lock);   \
60        X;                                 \
61        pthread_mutex_unlock(&print_lock); \
62        })
63*/
64
65#define MCA_DISPLAY2(X)
66
67
68
69typedef struct sMCA {
70    int p, np;         // numero du processeur et nb total de processeurs
71   
72    uint8  ** X; // image source
73    uint32 ** E; // image d'etiquette 32 bits
74   
75    int width;
76    int height;
77   
78    int i0, i1;
79    int j0, j1;
80   
81    uint32 e0, e1; // indice pour chaque bande
82    uint32 ne;     // indice max d'etiquettes utilise par bande
83
84    int alpha;     // puissance de 2 >= a la taille d'un bloc
85    uint32  * T;   // table d'quivalence table (Rosenfeld) ou d'indices (Warp)
86    uint32 ** D;   // distributed table (instanciee dans chaque worker)
87   
88    RegionStats * stats;
89    RegionStats ** F;
90   
91    struct sMCA * mca;   // pointeur vers le maitre (pour les esclaves)
92    struct sMCA ** mcas; // tableau de pointeurs vers les workers
93
94    // For pyramidal barriers
95    int nb_level;
96    pthread_barrier_t * barriers;
97} MCA;
98 
99void MCA_Error(char * msg);
100
101MCA * MCA_pConstructor_Empty(void);
102MCA * MCA_pDestructor(MCA * mca);
103
104void MCA_Set_ImageX(MCA * mca, uint8  ** X);
105void MCA_Set_ImageL(MCA * mca, uint32 ** E);
106
107void MCA_Set_Size(MCA * mca, int width, int height);
108void MCA_Set_NP(MCA * mca, int np);
109
110uint32 MCA_CalcMaxLabels(int connection, uint32 height, uint32 width);
111
112void MCA_Display_Parameters(MCA *mca);
113
114void MCA_Initialize(MCA * mca);
115void MCA_Finalize  (MCA * mca);
116
117
118// master to workers
119void MCA_Scatter_ImageX(MCA * mca);
120
121// workers to master
122void MCA_Gather_ImageL(MCA * mca);
123
124// CC run
125void MCA_Rosenfeld(MCA * mca);
126void MCA_MPar(MCA * mca);
127void MCA_Warp(MCA * mca);
128
129
130#endif // __MCA_H__
131
Note: See TracBrowser for help on using the repository browser.