Added basic functionality to control fans of nvidia gpu
This commit is contained in:
parent
c662b0d216
commit
88a5d2a45e
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
|
/fanControl
|
||||||
# Prerequisites
|
# Prerequisites
|
||||||
*.d
|
*.d
|
||||||
|
|
||||||
|
22
README.md
22
README.md
@ -1,2 +1,24 @@
|
|||||||
# fanControl
|
# fanControl
|
||||||
Simple script for controlling your system fans
|
Simple script for controlling your system fans
|
||||||
|
|
||||||
|
Currently only works for nvidia gpu.
|
||||||
|
|
||||||
|
To install just clone the repo and compile the code:
|
||||||
|
<code> g++ -O3 -o fanControl main.cpp</code>
|
||||||
|
|
||||||
|
Best used with tmux and running <code> sudo ./fanControl </code>
|
||||||
|
<br>
|
||||||
|
<h2> Setting custom fan curve </h2>
|
||||||
|
To make your own custom fan curve just edit "TEMP_THRESHOLD" and "FAN_SPEED".
|
||||||
|
<b>Example:</b><code> TEMP_THRESHOLD[] = {30, 50, 80};
|
||||||
|
FAN_SPEEd[] = {0, 30, 50, 80};
|
||||||
|
</code>
|
||||||
|
|
||||||
|
When the GPU temperature is below 30°C, the fans will not spin (0% speed).
|
||||||
|
|
||||||
|
Once the temperature reaches 30°C or higher, the fans will spin at 30% speed.
|
||||||
|
|
||||||
|
When the temperature reaches 50°C or higher, the fan speed increases to 50%.
|
||||||
|
|
||||||
|
At 80°C or higher, the fans will spin at full speed (80%).
|
||||||
|
|
||||||
|
69
main.cpp
Normal file
69
main.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
const int MIN_TEMP = 30;
|
||||||
|
const int MAX_TEMP = 80;
|
||||||
|
const int TEMP_THRESHOLD[] ={30, 40, 55, 60, 70, 80, 85};
|
||||||
|
const int FAN_SPEED[] = { 0, 30, 40, 50, 60, 65, 80, 100};
|
||||||
|
|
||||||
|
int getTemperature(){
|
||||||
|
std::string command = "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits";
|
||||||
|
|
||||||
|
FILE* fp = popen(command.c_str(), "r");
|
||||||
|
if(fp == NULL){
|
||||||
|
std::cerr << "Failed to run command to get GPU temperature." << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
char buffer[128];
|
||||||
|
std::string result = "";
|
||||||
|
while(fgets(buffer, sizeof(buffer), fp) != NULL){
|
||||||
|
result += buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
pclose(fp);
|
||||||
|
|
||||||
|
int temp;
|
||||||
|
std::stringstream(result) >> temp;
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void setGpuFanSpeed(int speed){
|
||||||
|
if(speed < 0 || speed > 100){
|
||||||
|
std::cerr << "Invalid fan speed:" << speed << ", speed must be between 0 and 100." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string command = "nvidia-settings --assign 'GPUTargetFanSpeed=" + std::to_string(speed) + "'";
|
||||||
|
|
||||||
|
if(system(command.c_str()) == 0){
|
||||||
|
std::cout << "Fan speed set to " << speed << "%" << std::endl;
|
||||||
|
}else{
|
||||||
|
std::cerr << "Failed to change fan speed." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int getFanSpeedFromTemperature(int temperature){
|
||||||
|
for(size_t i = 0; i < std::size(TEMP_THRESHOLD); i++){
|
||||||
|
if(temperature < TEMP_THRESHOLD[i]) return FAN_SPEED[i];
|
||||||
|
|
||||||
|
}
|
||||||
|
return FAN_SPEED[std::size(FAN_SPEED) - 1]; // max speed
|
||||||
|
|
||||||
|
}
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
int temperature = getTemperature();
|
||||||
|
|
||||||
|
if(temperature == -1){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "GPU temperature: " << temperature << "°C" << std::endl;
|
||||||
|
setGpuFanSpeed(getFanSpeedFromTemperature(temperature));
|
||||||
|
sleep(5);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user