본문 바로가기

Linux

리눅스에서 라데온 GPU 전력 제한하는 방법

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

그래픽카드를 사용하면 언제나 신경쓰이는 것이 바로 전력 소모입니다.

언더볼팅, 다운클럭을 해도 고사양 게임이나 그래픽 관련 작업을 할 때 90W는 기본으로 끌어다 쓰는걸 보면 전기요금이 걱정됩니다.

 

윈도우즈의 라데온 소프트웨어에 포함되어 있는 와트맨에는 전력제한이란 옵션이 있는데 -30%까지밖에 설정하지 못하고 그마저도 소비 전력을 보면 영 줄어든 것 같지도 않습니다.

 

리눅스에도 4.20 버전부터 와트맨처럼 GPU 설정을 조정할 수 있는 인터페이스가 sysfs를 통해 제공됩니다. 그런데 윈도우즈에서 와트맨으로 전력를 제한하는 것보다 더 확실하게 그리고 낮게 설정할 수 있다는걸 발견했습니다.

 

라데온 그래픽카드의 인터페이스는 /sys/class/drm/card0/device/ 안에 제공됩니다. 여기서 저희가 조정할 전력 제한은 그 안의 hwmon/hwmon*/ 디렉토리에 존재합니다. hwmon*이라고 표시한 것은 사용하는 시스템에 따라 숫자가 다르게 표시될 수 있기 때문입니다. 보통은 hwmon2로 표시됩니다.

이 디렉토리에서는 GPU의 여러 상태를 보고 설정할 수 있습니다. (팬 속도, 현재 클럭, 온도, 소비전력)

 

여기서 다룰 것은 전력을 제한하는 것 뿐이니 power1_* 파일들만 보겠습니다. 궁금하시다면 다른 파일들도 cat으로 출력해보고 리눅스 커널소스의 amdgpu 드라이버의 amdgpu_pm.c 파일의 주석을 읽어보시면 도움이 됩니다.

power1_average, power1_cap, power1_cap_min, power1_cap_max 를 각각 읽어봤습니다.

여기서 표시되는 숫자는 모두 micro-watt 단위입니다. 즉 W = µW x 106 입니다. 그러므로 뒤에서 숫자 6개를 지난 위치에 소수점을 넣으면 W 단위로 변환됩니다. 제 GPU는 현재 32.01400W를 소비하고 있습니다.

 

파일 이름에서 알 수 있듯이 power1_average는 현재 소비하는 전력이고, power1_cap은 현재 설정된 최대 소비 전력, power1_cap_min/max는 최대 소비전력 제한 범위를 나타냅니다.

 

power1_cap_max를 보면 175W까지 가능하고 현재 설정된 power1_cap을 보면 135W라고 나와있습니다. 와트맨의 전력 제한은 ±30%이므로 135 x 130%를 하면 대충 175W가 나오니 최대 소비전력은 와트맨을 사용하는 것과 동일하게 제한되는 것을 알 수 있습니다. 다만 min을 보면 0이라고 되어있는데 전력 소비를 가능한 한 낮게 제한할 수 있다는 뜻이 됩니다.

 

전력을 제한하는 방법은 sysfs이므로 power1_cap에 원하는 값을 써주면 됩니다. 만약 35W로 제한하고 싶다면 micro-watt 단위로 35000000을 써주면 됩니다.

# echo '35000000' > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap

실제로 전력 제한이 제대로 되는지 확인해보기 위해 Furmark를 제작한 회사인 geeks3d의 리눅스용 GpuTest 프로그램을 돌리면서 실시간으로 전력을 확인해봤습니다.

 

먼저 기본 상태로 돌렸을 때 135W에 근접하게 전력을 소비하는 것을 볼 수 있습니다.

이번엔 35W로 전력을 제한하고 실행해봤습니다.

35W로 제한하고 돌렸더니 60W 정도 소비하고 있습니다. 아무래도 35W로는 도저히 저 프로그램을 돌릴 수 없었나 봅니다.

제가 직접 p states를 0만 사용하도록(300MHz, 750mV) 설정한 뒤 전력제한을 풀고 벤치마크를 실행한 결과 동일하게 60W가량 소비하는 것을 확인했습니다. 최소 성능으로 풀로드를 걸 시 60W를 소비하는 것으로 보입니다.

 

아무튼 리눅스에서 라데온 그래픽카드의 최대 소비전력을 제한할 수 있고, 이를 사용하면 GPU가 가능한 한 설정된 제한을 지키려고 한다는 것을 알 수 있었습니다.

 

그리고 power1_cap의 최소 입력가능한 값이 0이던데 제가 입력해보니 아무 일도 일어나지 않았습니다.