Groupes de threads

[VÉRIFIÉ] Dernière mise à jour par Joe Schaefer sur dim., 14 sept. 2025    source
 

Groupe de threads généré par l'IA.

Fils POSIX

Cette année, j’ai été chargé de transférer notre fonction de probabilité maximale d’une version filetée unique à une version multithread, sur la base de l’hypothèse architecturale que la partie la plus lente de ce code est où la logique d’optimisation réelle boucle sur un index du groupe de modélisation Id, qui par conception, chaque itération à travers la boucle devrait être indépendante du reste.

Problème amusant lors de la boucle

  1. ne parvient pas à réinitialiser les variables automatiques dépendantes,
  2. modifie plusieurs pointeurs globaux indexés par ID de groupe de modélisation (jg),
  3. a désespérément besoin de variables thread_local pour séparer les segments de mémoire globale dédiés au calcul (par ID).

1 et 3 étaient simples. Avec 2 j’ai découvert un algorithme intelligent impliquant le concept de THREAD_BUNDLE, qui est un bloc par thread d’ID de groupe de modélisation série.

En assurant THREAD_BUNDLE est au moins aussi grand qu’une taille de page de mémoire divisée par la taille des pointeurs individuels en 2, nous pouvons nous assurer que différents threads fonctionnent sur indépendant pages dans la mémoire virtuelle, afin que nous puissions éviter les verrous mutex sur ces écritures de mémoire. (En supposant bien sûr que les threads traitent leurs THREAD_BUNDLE à peu près à la même vitesse).

De plus, j’ai finalement supprimé la dépendance “à la même vitesse” en divisant la boucle en paires pair/impair, ce qui garantit au moins une mémoire page sépare l’actif THREAD_BUNDLE boucles.

Nb de boucles principales

  /* EVEN */
  for (jG = minG; jG <= numG; jG += 2*THREAD_BUNDLE)
  {
    pthread_t ptid; 3 refs
    arg_t* arg = mal (sizeof(*arg), "arg_t"); 12 refs

#define SET_ARG(foo) arg->foo = (foo) 30 refs

SET_ARG(jG);
    ...

#undef SET_ARG

// rsim_mlf_thread loops over the index bundle
    // from jG to MIN(numG, jG + THREAD_BUNDLE - minG), doing
    // stuff with global data structures also indexed by jG

pthread_create (&ptid, NULL, rsim_mlf_thread, arg);
    PUSH_STACK_ELT(thread_stack, ptid, pthread_t);
  }

{
    pthread_t * ptid; 3 refs
    while (POP_STACK_PTR(thread_stack, ptid, pthread_t) != NULL)
    {
      arg_t* arg; 6 refs
      pthread_join(*ptid, (void**)&arg);
      ...
  }

/* ODD */
  for (jG = THREAD_BUNDLE + minG; jG <= numG; jG += 2*THREAD_BUNDLE)
  {
    pthread_t ptid; 3 refs
    arg_t* arg = mal (sizeof(*arg), "arg_t"); 12 refs
    ...
Lien permanent  #C   #mutex   #POSIX   #pthread  

 


Commentaires  


Pièces jointes  

Liens  


Index


Dépendances de la langue anglaise


étoile du soleil seulement


COVID-19 de mars 2020

  • Croissance exponentielle et COVID-19 — Prenez votre temps avec la section math — il est important d’être un consommateur éduqué de statistiques pertinentes pour la pandémie actuelle … jeu., 06 mars 2025

 


Heyoka


NonFunctional Tests


 

  • Listes de diffusion — Ces adresses temporaires sont anathèmes à ezmlm-idxles systèmes d’abonnement et de modération … jeu., 02 mai 2024

 


 

  • La joie de DTrace — Mesurez deux fois, coupez une fois, avant de vous lancer dans un effort d’optimisation de code … mer., 17 avr. 2024

 


 

  • Sur le problème du spam… — Le meilleur plugin pour qpsmtpd, bien qu’il soit difficile de comprendre pourquoi … dim., 29 janv. 2023

Nid d'abeille hyperbolique


 

  • Fun avec htop — Fonctionnalités htop avancées sur les plates-formes Unix populaires … jeu., 19 janv. 2023

Architecture des informations

  • Architecture des informations — Toute la gamme de technologies pertinentes pour la conception, la présentation, les relations et les contraintes architecturales qui couvrent chaque URL que vous servez … lun., 11 mars 2024

goudronné et plumé


 

  • Le mouvement DevOps — La grande idée derrière le “mouvement” n’est pas simplement de donner aux développeurs plus de corde … ven., 26 avr. 2024

 

  • Performances des applications — De nombreux développeurs tombent dans le piège de penser que l’optimisation des performances consiste à rendre chaque ligne de code aussi efficace que possible. … ven., 26 avr. 2024