Variables d’environnement pour les clients GPU

  |   5666  |  Poster commentaire  |  Optimisations
Afin d’adapter et d’optimiser le fonctionnement des clients GPU à la multitude de matériel disponible, les développeurs ont inclus des paramètres personnalisables avec des variables d’environnement. Ces paramètres peuvent avoir une influence sur les performances du core, sa stabilité ou les deux. Cet article explique comment configurer ces variables d’environnement, et détaille les paramètres disponibles pour une carte ATI ou nVidia.

Attention, certaines variables sont susceptibles de disparaître, ou d’autres peuvent être ajoutées suivant l’avancement du développement et de l’optimisation du core. Cet article sera mis à jour en conséquence.

Configuration des variables

Cette partie a été rédigée en prenant Windows XP comme base, mais la philosophie sous Vista ou Seven reste identique, seuls les intitulés des menus peuvent varier un peu d’une version à l’aure.

Plusieurs méthodes existent pour ouvrir l’élément du panneau de configuration qui nous intéresse :

  • Démarrer > Panneau de configuration > Système (si vous avez un affichage par catégories, basculez en affichage classique).
  • Clic droit sur poste de travail > Propriétés
  • Le plus simple et universel, la combinaison de touches WIN + Pause du clavier (la touche WIN est la touche sur laquelle le logo Windows est dessiné).


Une fois sur la fenêtre Propriétés Système, allez sur l’onglet Avancé et cliquez sur le bouton Variables d’environnement. Voici la fenêtre qui apparaît :



Dans cette fenêtre, vous pouvez voir deux parties. La partie supérieure appelée Variables utilisateur ne s’applique qu’à l’utilisateur en cours. Les variables configurées ici s’appliquent immédiatement à l’utilisateur en cours et un simple redémarrage du client Folding@Home suffit à les prendre en compte. Si vous utilisez le client en service et/ou que vous avez plusieurs utilisateurs sur la machine, ce n’est pas la bonne solution pour configurer vos variables. Si vous êtes l’unique utilisateur de votre machine, c’est ici qu’il est le plus simple de configurer vos variables.

La deuxième partie de la fenêtre, est appelée Variables système. Les variables configurées ici s’appliquent à tous les utilisateurs du système, mais un redémarrage de la machine est nécessaire pour prendre en compte les modifications.

Quel que soit l’endroit où vous configurez vos variables, gardez à l’esprit que les noms sont sensibles à la casse : VARIABLE_ENV est différend de variable_env … ne vous faites pas piéger.

Pour vérifier que vos variables sont bien configurées, lancez un Invite de commandes (Démarrer > Programmes > Accessoires > Invite de commandes), et utilisez la commande « echo %NOM_VARIABLE% » … lorsque la variable est correctement configurée, sa valeur est affichée, sinon %NOM_VARIABLE% est retourné.

Exemple :

Code :
C:\>echo %FLUSH_INTERVAL%
128


Maintenant que vous savez comment configurer les variables, voici la liste des configurations possibles et leur signification.

Pour cartes ATI

Ces variables ne sont utilisables qu’avec un core v1.24 ou supérieur, et des drivers Catalyst 9.3 ou plus récents.

FLUSH_INTERVAL est ce qui va affecter les performances graphiques (phénomène de lag en 2D par exemple). Cela correspond au nombre de fonctions envoyées en une fois au GPU. Le GPU ne fera rien d'autre, y compris le rafraîchissement de l'interface, jusqu'à ce que le traitement de cet envoi se termine. Une valeur faible réduit le temps où F@H monopolise le GPU, et le temps de réponse de l'interface augmente. Cependant, plus la valeur devient faible, plus la surcharge CPU liée à l'OS et au driver augmente, il y a donc un compromis à trouver entre la performance de F@H et la fluidité de l'interface. Si le paquet est trop long a traiter, cela peut provoquer un VPU Recover, le driver pensant que le GPU est planté (alors qu'il met juste trop de temps à répondre).

CAL_NO_FLUSH et CAL_PRE_FLUSH changent la méthode de soumission des paquets de fonctions au matériel. CAL_NO_FLUSH change la façon de construire les paquets de fonctions. CAL_PRE_FLUSH permet de mettre en cache les paquets de fonctions, afin de préparer le suivant à l'avance pendant que le GPU traite le paquet courant.

BROOK_YIELD a plusieurs modes : 0/1/2. 0 va monopoliser le CPU afin d'avoir la plus faible latence de réponse du GPU. 1 va libérer le CPU pendant l'attente de réponse du GPU pour tout processus de même priorité ou de priorité inférieure. 2 va libérer le CPU pour tout processus, quelle que soit sa priorité. Maintenant, pour de très petites valeurs du FLUSH_INTERVAL et des petites protéines, il y a des chances que le GPU ait presque finit lorsque le CPU se libère. Il faut donc attendre le réordonancement qui peut prendre jusqu'à une milliseconde. Un GPU rapide termine la plupart des noyaux en moins de 100 microsecondes, donc l'attente du réordonancement peut avoir un gros impact sur les performances. Avec une valeur élevée de FLUSH_INTERVAL, il est facile de construire plusieurs millisecondes de travail, alors quelques réordonancements sont moins visibles.

Voici un exemple de configuration :

FLUSH_INTERVAL = 128-256 pour une 48x0, 64-96 pour une 38x0 (à adapter pour que l’utilisation GPU reste à 100% quelle que soit la WU, sans provoquer trop de lag).
BROOK_YIELD = 2 (pour ne plus utiliser le CPU à 100%, et pouvoir lancer un client CPU en plus)
CAL_PRE_FLUSH = 1
CAL_NO_FLUSH = 1 (à remettre à 0 si cela provoque trop de VPU Recover).

Pour cartes nVidia

NV_FAH_CPU_AFFINITY sert à régler les affinités du core. Il n’est normalement pas à configurer, sauf si vous avez des problèmes de conflits (performances dégradée par le partage d’un cœur). Les valeurs acceptées sont 0 à 15 … cette valeur numérique représente en réalité un masque binaire tel que chaque bit correspond un CPU : CPU3,CPU2,CPU1,CPU0. Une valeur 1 autorise l’accès au CPU en question, et une valeur 0 en interdit l’accès. Une valeur numérique 0 est la valeur par défaut : elle autorise l’accès à tous les cores. Si vous utilisez cette variable dans une configuration personnalisée, il est recommandé de laisser le client en mode dévérouillé.

Voici quelques exemples pour différentes valeurs, ainsi que des valeurs notables :

1 -> 0001 : CPU0 uniquement
2 -> 0010 : CPU1 uniquement
3 -> 0011 : CPU1 et CPU0 … valeur recommandée pour un dual core.
7 -> 0111 : CPU2, CPU1 et CPU0 … valeur adaptée à un tri core.
9 -> 1001 : CPU3 et CPU0
11 -> 1011 : CPU3, CPU1 et CPU0
15 -> 1111 : CPU3, CPU2, CPU1 et CPU0 … valeur adaptée à un quad core.

La plupart des valeurs donnent des combinaisons exotiques comme vous pouvez le voir (1, 3, 9, 11, …;) mais peuvent être utiles si vous avez un besoin particulier. Les valeurs les plus courantes sont donc 0 (valeur par défaut), 3 (dual core), 7 (tri core) et 15 (quad core).

FAH_GPU_IDLE est une variable qui a été introduite avec le core 1.26 afin d’aider à réduire la surchauffe de certaines cartes avec certaines Wus, à la demande de certains membres de la communauté. Sa valeur correspond au taux de temps d’attente que l’on souhaite introduire dans le core. Par exemple, une valeur de 10 correspond à 10% de temps d’attente. La baisse de performance n’est pas forcément proportionnelle au temps d’attente : en effet, suivant la configuration des calculs, il ne sera peut être pas possible de maintenir exactement la valeur demandée. Cette valeur est donc une cible, mais dans la pratique, le temps d’attente effectif variera autour de cette valeur. Si votre carte a des problèmes de surchauffe, à vous de trouver la valeur qui vous convient le mieux pour garder des performances raisonnables, tout en limitant la surchauffe de votre carte.

Bon pliage sur GPU.