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

Last change on this file was 823, checked in by meunier, 8 years ago
  • Improved scripts for simulations and graphes
  • Continued to clean up the lib nrc2 (from nrio2x.x to nrmem1.c)
  • Added a version (Fast - Parmerge - No stats)
File size: 3.3 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 spinlock,
29// because apparently spinlocks 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
35
36
37#if MCA_VERBOSE_LEVEL >= 1
38    #define MCA_VERBOSE1(X) ({             \
39        pthread_mutex_lock(&print_lock);   \
40        X;                                 \
41        pthread_mutex_unlock(&print_lock); \
42        })
43#else
44    #define MCA_VERBOSE1(X)
45#endif
46
47#if MCA_VERBOSE_LEVEL >= 2
48    #define MCA_VERBOSE2(X) ({             \
49        pthread_mutex_lock(&print_lock);   \
50        X;                                 \
51        pthread_mutex_unlock(&print_lock); \
52        })
53#else
54    #define MCA_VERBOSE2(X)
55#endif
56
57#if MCA_VERBOSE_LEVEL >= 3
58    #define MCA_VERBOSE3(X) ({             \
59        pthread_mutex_lock(&print_lock);   \
60        X;                                 \
61        pthread_mutex_unlock(&print_lock); \
62        })
63#else
64    #define MCA_VERBOSE3(X)
65#endif
66
67
68typedef struct sMCA {
69    int p, np;   // numero du processeur et nb total de processeurs
70    int nr;      // nombre de runs successifs à mesurer
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    uint32 ne_prev; // ne de l'image précédente (pour le reset de T)
84
85    int alpha;      // puissance de 2 >= a la taille d'un bloc
86    uint32  * T;    // table d'quivalence table (Rosenfeld) ou d'indices (Warp)
87    uint32 ** D;    // distributed table (instanciee dans chaque worker)
88   
89    RegionStats * stats;
90    RegionStats ** F;
91   
92    struct sMCA * mca;   // pointeur vers le maitre (pour les esclaves)
93    struct sMCA ** mcas; // tableau de pointeurs vers les workers
94
95    // For pyramidal barriers
96    int nb_level;
97    pthread_barrier_t * barriers;
98} MCA;
99 
100void MCA_Error(char * msg);
101
102MCA * MCA_pConstructor_Empty(void);
103MCA * MCA_pDestructor(MCA * mca);
104
105void MCA_Set_ImageX(MCA * mca, uint8  ** X);
106void MCA_Set_ImageL(MCA * mca, uint32 ** E);
107
108void MCA_Set_Size(MCA * mca, int width, int height);
109void MCA_Set_NP(MCA * mca, int np);
110void MCA_Set_NR(MCA * mca, int nr);
111
112uint32 MCA_CalcMaxLabels(int connection, uint32 height, uint32 width);
113
114void MCA_Display_Parameters(MCA *mca);
115
116void MCA_Initialize(MCA * mca);
117void MCA_Finalize  (MCA * mca);
118
119
120// master to workers
121void MCA_Scatter_ImageX(MCA * mca);
122
123// workers to master
124void MCA_Gather_ImageL(MCA * mca);
125
126// CC run
127void MCA_Rosenfeld(MCA * mca);
128void MCA_MPar(MCA * mca);
129void MCA_Warp(MCA * mca);
130
131
132#endif // __MCA_H__
133
Note: See TracBrowser for help on using the repository browser.