Projet M1 et M2 Informatique 2017-18, création d'un solver en calcul propositionnel.
On dispose d'un ensemble $X = \{ x_1, ..., x_N \}$ de $N$ variables propositionnelles ($Card(X) = N$)) et $K$ contraintes de cardinalité.
On rappelle qu'une contrainte de cardinalité est de la forme $#(α, β, V_i)$ est qu'elle signifie que au moins $α$ et au plus $β$ variables de $V_i$ sont vraies.
Par exemple une clause de la forme $p ∨ ¬q ∨ ¬r ∨ s$ peut être écrite $#(1,4, p, ¬q, ¬r, s)$
Afin de simplifier les calculs pour la vectorisation on désire utiliser la modélisation suivante:
Ainsi le problème :
$p ∨ ¬q ∨ ¬r$
$q ∨ r ∨ ¬s ∨ ¬t$
sera modélisé en :
indice | 0 | 1 | 2 | 3 | 4 |
X | p | q | r | s | t |
affectation | 0 | 1 | 2 | 2 | 2 |
c1 | 0 | 1 | 1 | 4 | 4 |
c2 | 4 | 0 | 0 | 1 | 1 |
On désire connaître pour une contrainte donnée, le nombre de variables à vrai (nb_true) et le nombre de variables non assignées (nb_unset) :
int cpp_cstr_count_true(char * RESTRICT v, char * RESTRICT c, size_t size, int *unset) {
int nb_true = 0;
int nb_unset = 0;
for (size_t i=0; i < size; ++i) {
int s = v[i] ^ c[i];
if (s < 2) {
nb_true += s;
} else if (s < 4) {
++nb_unset;
}
}
*unset = nb_unset;
return nb_true;
}
On donne 4 implantations de cette fonction :
On compile avec g++ -std=c++11 -Wall -mavx2 -O3 -funroll-loops :
size | method | time (s) |
13107 | 1 | 3.01 |
13107 | 2 | 0.22 |
13107 | 3 | 0.10 |
13107 | 4 | 0.11 |
131072 | 1 | 53.40 |
131072 | 2 | 2.27 |
131072 | 3 | 1.07 |
131072 | 4 | 1.16 |
1310727 | 1 | 546.73 |
1310727 | 2 | 23.81 |
1310727 | 3 | 11.96 |
1310727 | 4 | 12.53 |
En fonction des compilateurs on peut obtenir des résultats très variables
size | method | gnu | intel | llvm | pgi |
13107 | 1 | 3.01 | 0.21 | 0.43 | |
13107 | 2 | 0.22 | 0.23 | 0.23 | |
13107 | 3 | 0.10 | 0.12 | 0.11 | |
13107 | 4 | 0.11 | 0.12 | 0.13 | |
131072 | 1 | 53.40 | 1.87 | 4.29 | |
131072 | 2 | 2.27 | 2.36 | 2.28 | |
131072 | 3 | 1.07 | 1.18 | 1.15 | |
131072 | 4 | 1.16 | 1.22 | 1.17 | |
1310727 | 1 | 546.73 | 18.93 | 43.05 | |
1310727 | 2 | 23.81 | 23.78 | 22.84 | |
1310727 | 3 | 11.96 | 12.22 | 11.85 | |
1310727 | 4 | 12.53 | 12.72 | 12.04 |