2017-07-27 3 views
0

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; 
    } 
} 
+0

VS 2017 semble le faire. –

+0

Je suppose que l'évaluation de 'c_pos' a une faute de frappe. – Peter

+0

@Peter, whoops, oui. Merci. Fixé! – Gnat

Répondre

0

Malheureusement, cela semble être un bug ou une limitation dans le compilateur Visual C++ 2013. Les autres compilateurs utilisent l'instruction CMPPD (AVX/AVX2) ou CMP*PD (SSE2).

Compilateurs qui avec succès vectoriser cette boucle comprennent:

  • Visual C++ 2017
  • Visual C++ 2015
  • Clang + LLVM (Apple LLVM version 8.1.0 (clang-802.0.42))

Bien qu'il soit théoriquement possible d'écrire la comparaison en tant qu'opérations au niveau du bit, c'est contre-productif et la meilleure option est de passer à un autre compilateur.