Je suis en train d'utiliser le Visual C++ 2013 auto-vectorisation pour faire la boucle suivante vectorisée (/arch:AVX2
), mais le compilateur refuse et donne le message suivant:Auto-vectorisation des comparaisons contenant des boucles
info C5002: loop not vectorized due to reason '1100'
Cette reason code signifie
Loop contains control flow—for example, "if" or "?".
J'ai essayé de diviser les comparaisons et l'affectation finale dans une boucle séparée mais qui semble inefficace quand il y a des intrinsics disponibles pour effectuer des comparaisons sur virgule flottante val ues.
Pourquoi le compilateur doit-il traiter les comparaisons comme un contrôle de flux, et que puis-je modifier dans l'implémentation pour que le compilateur vectorise cette fonction?
void triplets_positive(
const std::uint64_t count,
double * const a,
double * const b,
double * const c,
std::uint64_t * const all_positive)
{
for (std::uint64_t i = 0; i < count; ++i)
{
// These >= operations make the loop not vectorisable because
// they introduce control flow.
std::uint64_t a_pos = (a[i] >= 0.0);
std::uint64_t b_pos = (b[i] >= 0.0);
std::uint64_t c_pos = (c[i] >= 0.0);
all_positive[i] = a_pos & b_pos & c_pos;
}
}
VS 2017 semble le faire. –
Je suppose que l'évaluation de 'c_pos' a une faute de frappe. – Peter
@Peter, whoops, oui. Merci. Fixé! – Gnat