• [^] # Re: Ai-je bien compris ?

    Posté par . En réponse au journal Performances des processeurs Intel et optimisation. Évalué à 3.

    Bonjour,

    En fait, le programme qui fait le benchmark n'utilise qu'un thread. La version pas thread-safe de la base de donnée, donc sans les instructions atomiques, s'exécute correctement car un seul thread accède à la base de donnée. La version thread-safe de la base de donnée est aussi utilisée par ce même unique thread.

    C'est comme si je comparais ces deux fonctions :

    void thread_safe(int *ptr)
    {
     __sync_fetch_and_add(ptr, 1);
    }
    void not_thread_safe(int *ptr)
    {
     *ptr += 1;
    }
    #define BENCHMARK_TYPE SAFE
    void benchmark()
    {
     volatile int var = 0;
     for (unsigned int i=0; i<BENCHMARK_ITERATIONS; ++i)
     {
    #if BENCHMARK_TYPE == SAGE
     thread_safe(&var);
    #else
     not_thread_safe(&var);
    #endif
     }
     assert(var == BENCHMARK_ITERATIONS);
    }
    
    

    Le benchmark ne teste donc pas la validité de l'implémentation (c'est testé par des tests unitaires dédiés), mais seulement sa rapidité, en mono-thread. Cela permet donc d'évaluer l'overhead des instructions atomiques, qui est ici négatif, ce qui est surprenant.

    Après, c'est vrai que la base de donnée non thread-safe est « buguée » si on veut l'utiliser en mode thread-safe, mais elle reste parfaitement utilisable par un programme qui aurait une base de donnée propre par thread, ou qui serait mono-thread, ou qui protégerait lui-même les accès par un mutex.

    Pour ce qui est des lignes de cache, toutes les opérations atomiques portent sur des adresses mémoires différentes (il n'y a pas de lock global, tout est de grain fin). Les objets stockés dans la base de donnée font 16 octets, il y en a donc 4 par ligne de cache de 64 octets. C'est en effet un problème quand on accède à des objets proches l'un de l'autre, je verrai avec le temps si cela pose problème et si je dois ajouter des zéros à la fin de mes objets pour qu'ils fassent 64 octets et soient alignés avec le cache.