• # Quitte à faire du branchless

    Posté par (site web personnel) . En réponse au journal Exercices de programmation et benchmarks. Évalué à 4.

    Je te propose cette légère amélioration :

    int matrix_elements_sum_branchless_2(const std::vector<std::vector<int>>& matrix)
    {
     const int row_size(matrix[0].size());
     std::vector<int> usable_column(row_size, -1);
     int result(0);
     for (const std::vector<int>& row : matrix)
     for (int i(0); i != row_size; ++i)
     {
     const int v(row[i]);
     result += v & usable_column[i];
     usable_column[i] &= v ? -1 : 0;
     }
     return result;
    }

    Elle a l'avantage de se vectoriser très bien, et d'éviter le passage par une multiplication. Elle reste moins bonne que la version de référence, sauf dans les cas dégénérés (pas de zéro p.e.). On notera qu'on pourrait aussi passer la boucle interne sous OpenMP :-)

    Cas dégénéré : http://quick-bench.com/PTIzGKHuheFGyKEVjkAPBwgDo4s
    Cas normal : http://quick-bench.com/goZHQlQ10U4sDqMiEP0nMyyXUBs

    Merci pour ce petit jeu d'esprit !