Ah tiens ! Pour Collatz...
Certains d'entre vous savent déjà que l'on peut optimiser les temps de calcul (-30% à -40% de durée
) en bricolant le fichier de config des exécutables du projet.
On trouve ces fameux fichiers, reconnaissables à leur extension
.config dans le répertoire du projet :
Windows : C:\ProgramData\BOINC\projects\boinc.thesonntags.com_collatzLinux/Debian : /var/lib/boinc-client/projects/boinc.thesonntags.com_collatz
Le fichier porte le même nom que l'exécutable, qui se trouve dans le même dossier.
Moi, par exemple, sur Windows, mon exécutable s'appelle
collatz_sieve_1.30_windows_x86_64__opencl_nvidia_gpu.exeEt le fichier config :
collatz_sieve_1.30_windows_x86_64__opencl_nvidia_gpu.configEnsuite, il faut bricoler une alchimie savante, selon votre marque/modèle de GPU.
En gros, il y a des paramètres qui fonctionnent partout et pour tout le monde et d'autres qu'il faut affiner selon son matos.
Une (longue
) discussion à ce sujet peut être trouvée ici :
https://boinc.thesonntags.com/collatz/forum_thread.php?id=8&sort_style=8&start=75
Voici ceux que tout le monde ou presque peut mettre sans souci :verbose=[0-1]- Ne change pas grand chose à la vitesse de calcul, mais permet d'inscrire une sortie texte dans les résultats, que l'on retrouvera sur le site, dans le "Stderr output" de chaque tâche.
- C'est pratique pour retrouver les réglages utilisés sur une WU renvoyée.
- Conseillé : verbose=1
sleep=[0-1]- Indique de ne pas insérer de pause entre chaque volée de données envoyées au GPU.
- Certains GPUs faiblards peuvent montrer des signes de faiblesse dans l'interface graphique (lag de la souris ou de l'affichage). Dans ce cas, on peut revenir à "sleep=1".
- Conseillé : sleep=0
cache_sieve=[0-1]- Indique de garder en mémoire cache la table de réduction, plutôt que de l'envoyer (et de perdre du temps) à chaque nouveau batch.
- Conseillé : cache_sieve=1
reduce_cpu=[0-1]- N'a, apparemment, pas d'effet.
- C'est censé indiquer de ne pas solliciter le CPU pour valider les sommes de contrôles pour chaque batch (et donc de gagner du temps).
- Conseillé : reduce_cpu=0
Et voici ceux qui sont un peu plus sensibles :sieve_size=[15-32, defaut : 30]- La taille du batch à calculer.
- La valeur par défaut, "30" peut être trop élevée pour certains petits GPUs.
- Il est conseillé de commencer à 24 et d'augmenter jusqu'à ce que l'utilisation du GPU soit proche de 100%.
- Si on monte trop haut : le pilote plante.
kernels_per_reduction=[1-64, defaut : 32]- Le nombre de noyaux qui seront lancés pour effectuer la réduction.
- Un nombre trop grand peut faire planter le pilote vidéo ou ralentir l'affichage.
- Un nombre trop petit ralentira le calcul.
- Les GPUs les plus faibles doivent commencer à 8, les plus élevés peuvent attaquer à 48.
- Conseillé : 48
threads=[5-11, defaut : 6]- Le nombre de processus lancés en parallèle pendant le calcul de réduction.
- C'est le réglage le plus difficile à trouver.
- La plupart des GPUs peuvent monter à 8, mais il planteront à 9.
lut_size=[5-20, defaut : 12]- Celui-là est sensible et, mal réglé, peut planter le calcul, mais il est facile à déterminer : il dépend de la taille du cache L2 sur le GPU.
- Il s'agit de faire rentrer la plus grande table de comparaison possible dans la L2, selon la formule suivante : 8(2^N).
- Ce qui donne :
lut_size=12 -> 8(2^12) = 32 768 (32 kB)
lut_size=15 -> 8(2^15) = 262 144 (256 kB)
lut_size=17 -> 8(2^17) = 1 048 576 (1 MB)
... - Exemple :
Ma GTX 1080 (non Ti) a 2 MB de cache L2 (cf. https://www.techpowerup.com/gpu-specs/geforce-gtx-1080.c2839).
-> Je peux imposer une lut_size de 17 (1MB).
Pourquoi pas 18 (2 MB) ? - Parce la table ne rentrera probablement pas dans un L2 qui stocke déjà nécessairement des données.
Dans les faits, dépasser la taille du cache L2 n'a pas d'impact négatif notable.
Voilà donc la config "idéale" pour ma GTX 1080 :verbose=1
sleep=0
cache_sieve=1
reduce_cpu=0
sieve_size=30
kernels_per_reduction=48
threads=8
lut_size=17
... Ça plie une WU en un peu moins de 6 minutes (contre un peu plus de 9 sans optimisation)
.
Notes :- Si le GPU est bien "réglé", il n'est pas efficace de faire tourner plusieurs WUs en simultané via une app_config : il sera déjà à ~100% avec une seule !
- Il n'est pas nécessaire de rédémarrer l'ordi, ou Boinc : le contenu du fichier exécutable est pris en compte à chaque nouvelle WU lancée. Vous pouvez laisser Collatz tourner pendant que vous modifiez les paramètres : la prochaine WU sera lancée avec les derniers paramètres enregistrés dans le fichier config.
- On peut trouver des exemples de config testées sur différents GPUs ici : https://boinc.thesonntags.com/collatz/forum_thread.php?id=8&postid=71