Intel TBB et conception par politiques
Bonjour,
c'est une question de design que j'aimerais poser. En fait ce n'est pas vraiment une question mais j'aimerais avoir votre avis.
Le code ci-dessous présente deux méthodes basiques qui effectuent l'opération 255-valeur sur tous les éléments d'un tableau d'octets.
Comme en ce moment j'étudie à la fois la librairie TBB et certaines méthodes de design, j'ai voulu mêler les deux.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
#include "tbb/parallel_for.h"
#include "tbb/blocked_range.h"
typedef unsigned char byte;
struct InvertPolicy_Serial {
static void apply (byte* ptr, const std::size_t sz) {
byte* ptr_start = ptr;
const byte* ptr_end = ptr_start+sz;
for (; ptr_start!=ptr_end; ++ptr_start)
*ptr_start = 255-*ptr_start;
}
};
struct InvertPolicy_TBB {
class FApply {
byte* ptr_;
public:
FApply (byte* ptr) : ptr_(ptr) {}
void operator () (const tbb::blocked_range<std::size_t>& r) const {
InvertPolicy_Serial::apply (ptr_+r.begin(),r.size());
}
};
static void apply (byte* ptr, const std::size_t sz, std::size_t grain_size=1e5) {
tbb::parallel_for (tbb::blocked_range<std::size_t>(0,sz,grain_size),
FApply (ptr));
}
};
template <typename FilterPolicy>
struct Invert {
static void apply (byte* ptr, std::size_t sz) {
FilterPolicy::apply (ptr,sz);
}
static void apply (byte* ptr, std::size_t sz, std::size_t grain_size) {
FilterPolicy::apply (ptr,sz,grain_size);
}
}; |
Donc on appelle les méthodes avec :
Code:
1 2 3 4
|
Invert<InvertPolicy_Serial>::apply (ptr,sz);
//ou
Invert<InvertPolicy_TBB>::apply (ptr,sz); |
On pourrait imaginer un InvertPolicy_OpenMP, InvertPolicy_CUDA, InvertPolicy_ASM etc...
Alors la question quand-même, est-ce que cette méthode a un intérêt, à part faire des benchmark ?
Dans un programme plus important, est-ce que cela peut s'avérer utile si les différentes politiques ne peuvent communiquer entre-elles (pour choisir entre une implémentation TBB ou CUDA par exemple suivant les tâches en cours) ?