Constraint Count

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 
Modélisation

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 :

Résultats

Exemple avec GNU 5.4

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 
Résultats sur Intel Core i5-7400 CPU @ 3.00GH, g++ v5.4.0

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    
Résultats sur différentes architectures