{"id":1430,"date":"2020-10-11T18:34:54","date_gmt":"2020-10-11T16:34:54","guid":{"rendered":"http:\/\/pila.fr\/wordpress\/?p=1430"},"modified":"2020-10-12T23:17:15","modified_gmt":"2020-10-12T21:17:15","slug":"macpro-11-optimiser-le-refroidissement-dun-gpu-amd-sous-linux","status":"publish","type":"post","link":"https:\/\/pila.fr\/wordpress\/archives\/1430","title":{"rendered":"MacPro 1,1 : Optimiser le refroidissement d&rsquo;un GPU AMD sous Linux"},"content":{"rendered":"\n<p>Sur ces machines, la ventilation est r\u00e9alis\u00e9e en 3 canaux s\u00e9par\u00e9s <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Canal 1 : CPU &amp; RAM : 2 ventilateurs, 1 en fa\u00e7ade et 1 \u00e0 l&rsquo;arri\u00e8re en extraction, dont la vitesse est r\u00e9gul\u00e9e en fonction de la temp\u00e9rature CPU<\/li><li>Canal 2 : GPU et cartes d&rsquo;extensions : 1 ventilateur en fa\u00e7ade<\/li><li>Canal 3 : Alimentation &amp; lecteurs optiques.<\/li><\/ul>\n\n\n\n<p>Sur mon syst\u00e8me, si les canaux 1 et 3 sont g\u00e9r\u00e9s correctement par le SMC ( le chip charg\u00e9 de la gestion du syst\u00e8me ), le ventilateur du canal 2 a sa vitesse fixe \u00e0 500 tr\/min. J&rsquo;imagine que la cause est \u00e0 trouver dans mon utilisation peut habituelle de cette machine : un GPU non officiel (AMD R9 380) sous un OS non officiel (Linux).<\/p>\n\n\n\n<p>Pour pallier \u00e0 ce probl\u00e8me, et effectivement piloter ce ventilateur en fonction de la demande en refroidissement du GPU, j&rsquo;ai \u00e9crit un script bash, qui contr\u00f4le ce ventilateur en fonction de la commande PWM du ventilateur du GPU ( attention, \u00e0 ma connaissance cette information n&rsquo;est disponible que sur le pilote graphique libre AMD ) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ cat \/opt\/IO_fan_control.sh<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\nBASE_FAN=\"\/sys\/devices\/platform\/applesmc.768\/fan2\"\nGPU_PWM_FILE=\"\/sys\/class\/drm\/card0\/device\/hwmon\/hwmon0\/pwm1\"\nGPU_PWM_MIN=75\nGPU_PWM_MAX=250\n\nfunction setfancontrolmanual()\n{\n        echo $1 > $BASE_FAN\"_manual\"\n        if (( $? == 0 ))\n        then\n                if (( $1 == 0 ))\n        then\n                        echo \"Returning fan control to SMC\"\n                else\n                        echo \"Taking control of fan from SMC\"\n                fi\n        else\n                if (( $1 == 0 ))\n        then\n                        echo \"Failed to return fan control to SMC\"\n                        exit 1\n                else\n                        echo \"Failed to take control of fan from SMC\"\n                        exit 1\n                fi\n        fi\n}\n\nfunction abort()\n{\n        setfancontrolmanual 0\n        exit\n}\n\nfunction checkforroot()\n{\n        if(( $(id -u)  != 0 ));\n        then\n                echo \"Need to be run as root\";\n                exit\n        fi\n}\n\ncheckforroot\nif [ \"$1\" == \"release\" ]; then\n        setfancontrolmanual 0\n        exit\nfi\n\ntrap abort SIGINT\nsetfancontrolmanual 1\n\nwhile true\ndo\n        INPUT_RPM=$(&lt;$BASE_FAN'_input')\n        MAX_RPM=$(&lt;$BASE_FAN'_max')\n        MIN_RPM=$(&lt;$BASE_FAN'_min')\n        GPU_PWM=$(&lt;$GPU_PWM_FILE)\n\n        #compute MAC fan RPM from GPU fan PWM\n        if (( $GPU_PWM >= $GPU_PWM_MAX )); then\n                TARGET_RPM=$MAX_RPM\n        elif (( $GPU_PWM &lt;= $GPU_PWM_MIN )); then\n                TARGET_RPM=$MIN_RPM\n        else\n                TARGET_RPM=$(( ($MAX_RPM - $MIN_RPM) * ( $GPU_PWM - $GPU_PWM_MIN ) \/ ($GPU_PWM_MAX - $GPU_PWM_MIN) + $MIN_RPM))\n        fi\n\n        #clamp value between MIN_RPM and MAX_RPM\n        if (( $TARGET_RPM &lt; $MIN_RPM )); then\n                OUTPUT_RPM=$MIN_RPM\n        elif (( $TARGET_RPM > $MAX_RPM )); then\n                OUTPUT_RPM=$MAX_RPM\n        else\n                OUTPUT_RPM=$TARGET_RPM\n        fi\n\n        echo $OUTPUT_RPM > $BASE_FAN'_output'\n\n        echo 'INPUT_RPM: '$INPUT_RPM' MAX_RPM: '$MAX_RPM' MIN_RPM: '$MIN_RPM' GPU_PWM: '$GPU_PWM' TARGET_RPM: '$TARGET_RPM' OUTPUT_RPM: '$OUTPUT_RPM\n\n        sleep 2\ndone<\/code><\/pre>\n\n\n\n<p>Les variables GPU_PWM_MIN et GPU_PWM_MAX correspondent respectivement aux 2 valeur PWM \u00e0 laquelle le ventilateur du canal 2 sera command\u00e9 \u00e0 sa vitesse minimum, et celle o\u00f9 il sera command\u00e9 \u00e0 sa vitesse maximum.<\/p>\n\n\n\n<p>Ce script est ex\u00e9cut\u00e9 automatiquement au d\u00e9marrage gr\u00e2ce \u00e0 systemd<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ cat \/etc\/systemd\/system\/system_mac-io-fan-control.service<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>[Unit]\nDescription=MacPro IO fan control from GPU temperature\nAfter=systemd-udevd.service\n\n[Service]\nExecStart=\/opt\/IO_fan_control.sh\nRestart=always\nStartLimitIntervalSec=10\nExecStopPost=\/opt\/IO_fan_control.sh release\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p>Il ne reste plus qu&rsquo;\u00e0 activer l&rsquo;unit\u00e9 systemd cr\u00e9\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ sudo systemctl enable system_mac-io-fan-control.service\n$ sudo systemctl start system_mac-io-fan-control.service<\/code><\/pre>\n\n\n\n<p>La vitesse du ventilateur du canal 2 est maintenant asservie \u00e0 celle du GPU, facilitant le refroidissement de ce dernier, et r\u00e9duisant le niveau sonore de la machine.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sur ces machines, la ventilation est r\u00e9alis\u00e9e en 3 canaux s\u00e9par\u00e9s Canal 1 : CPU &amp; RAM : 2 ventilateurs, 1 en fa\u00e7ade et 1 \u00e0 l&rsquo;arri\u00e8re en extraction, dont la vitesse est r\u00e9gul\u00e9e en fonction de la temp\u00e9rature CPU Canal 2 : GPU et cartes d&rsquo;extensions : 1 ventilateur en fa\u00e7ade Canal 3 : &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/pila.fr\/wordpress\/archives\/1430\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[168,169,144,120],"class_list":["post-1430","post","type-post","status-publish","format-standard","hentry","category-linux-2","tag-amd","tag-cooling","tag-gpu","tag-mac","item-wrap"],"_links":{"self":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=1430"}],"version-history":[{"count":7,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1430\/revisions"}],"predecessor-version":[{"id":1437,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/posts\/1430\/revisions\/1437"}],"wp:attachment":[{"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=1430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=1430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pila.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=1430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}