mirror of
				https://github.com/keylase/nvidia-patch.git
				synced 2025-10-31 20:52:07 +00:00 
			
		
		
		
	
							
								
								
									
										54
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,40 +1,52 @@ | ||||
| # nvidia-patch | ||||
|  | ||||
| requirements: | ||||
| - Ubuntu 17.10 | ||||
| - nvenc-compatible gpu | ||||
| - kernel (<4.10.0)- 4.4.0-101-generic | ||||
| - nvidia 378.13 driver | ||||
|  | ||||
| # step-by-step : | ||||
| Requirements: | ||||
| - ubuntu (< 18.04 for 375.39 nvidia driver or kernel < 4.15) | ||||
| - nvenc-compatible gpu (https://developer.nvidia.com/video-encode-decode-gpu-support-matrix#Encoder) | ||||
| - nvidia driver (patch availible for 375.39 or 396.24) | ||||
|  | ||||
| Download driver: https://yadi.sk/d/d87mf0y03WTbb5 | ||||
|  | ||||
| chmod +x ./NVIDIA-Linux-x86_64-378.13.run | ||||
| Tested on Ubuntu 18.04 LTS (GNU/Linux 4.15.0-23-generic x86_64) | ||||
|  | ||||
| ./NVIDIA-Linux-x86_64-378.13.run | ||||
| ## step-by-step : | ||||
|  | ||||
| # check driver: | ||||
| ### Download driver | ||||
| http://us.download.nvidia.com/XFree86/Linux-x86_64/375.39/NVIDIA-Linux-x86_64-375.39.run | ||||
| http://us.download.nvidia.com/XFree86/Linux-x86_64/396.24/NVIDIA-Linux-x86_64-396.24.run | ||||
|  | ||||
| ### Install driver 396.24 | ||||
| ```bash | ||||
| mkdir /opt/nvidia && cd /opt/nvidia | ||||
| wget http://us.download.nvidia.com/XFree86/Linux-x86_64/396.24/NVIDIA-Linux-x86_64-396.24.run | ||||
| chmod +x ./NVIDIA-Linux-x86_64-375.39.run | ||||
| ./NVIDIA-Linux-x86_64-396.24.run | ||||
| ``` | ||||
|  | ||||
| ### Check driver | ||||
| ```bash | ||||
| nvidia-smi | ||||
| ``` | ||||
|  | ||||
| mkdir ~/nvenc_backup | ||||
| ### Patch libnvidia-encode.so (with backup) | ||||
| ```bash | ||||
| bash ./patch.sh | ||||
| ``` | ||||
|  | ||||
| cd ~/nvenc_backup | ||||
| ### Silent patch libnvidia-encode.so | ||||
| ```bash | ||||
| bash ./patch.sh -s | ||||
| ``` | ||||
|  | ||||
| cp /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.378.13 ~/nvenc_backup/ | ||||
|  | ||||
| wget https://raw.githubusercontent.com/keylase/nvidia-patch/master/patch.sh | ||||
|  | ||||
| chmod +x patch.sh | ||||
|  | ||||
| ./patch.sh ~/nvenc_backup/libnvidia-encode.so.378.13 /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.378.13 | ||||
|  | ||||
| reboot | ||||
| ### Rollback libnvidia-encode.so (restore from backup) | ||||
| ```bash | ||||
| bash ./patch.sh -r | ||||
| ``` | ||||
|  | ||||
| ## See also | ||||
|  | ||||
| https://habr.com/post/262563/ | ||||
|  | ||||
| If you experience `CreateBitstreamBuffer failed: out of memory (10)`, then you have to lower buffers number used for every encoding session. If you are using `ffmpeg`, consider using this [patch](https://gist.github.com/Snawoot/70ae403716c698cb86ab015626d72bd4). | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										86
									
								
								patch.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										86
									
								
								patch.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -1,9 +1,81 @@ | ||||
| #!/bin/bash | ||||
| input=$1 | ||||
| output=$2 | ||||
| if [ -z $1 ]; then | ||||
|   echo "Require params - example: ./patch.sh <input file> <output file>" | ||||
|   exit | ||||
| fi | ||||
| sed 's/\x85\xC0\x89\xC5\x75\x18/\x29\xC0\x89\xC5\x90\x90/g' $input > $output | ||||
|  | ||||
| backup_path="/opt/nvidia/libnvidia-encode-backup" | ||||
| silent_flag='' | ||||
| rollback_flag='' | ||||
|  | ||||
| print_usage() { printf ' | ||||
| SYNOPSIS | ||||
|        patch.sh [OPTION]... | ||||
|  | ||||
| DESCRIPTION | ||||
|        The patch for libnvidia-encode to increase encoder sessions | ||||
|  | ||||
|        -s    Silent mode (No output) | ||||
|        -r    Rollback to original (Restore lib from backup) | ||||
|  | ||||
| ' | ||||
| } | ||||
|  | ||||
| while getopts 'rs' flag; do | ||||
|   case "${flag}" in | ||||
|     r) rollback_flag='true' ;; | ||||
|     s) silent_flag='true' ;; | ||||
|     *) print_usage | ||||
|        exit 1 ;; | ||||
|   esac | ||||
| done | ||||
|  | ||||
| if [[ $silent_flag ]]; then | ||||
|     exec 1> /dev/null | ||||
| fi | ||||
|  | ||||
| declare -A patch_list=( | ||||
|     ["375.39"]='s/\x85\xC0\x89\xC5\x75\x18/\x29\xC0\x89\xC5\x90\x90/g' | ||||
|     ["396.24"]='s/\x85\xC0\x89\xC5\x0F\x85\x96\x00\x00\x00/\x29\xC0\x89\xC5\x90\x90\x90\x90\x90\x90/g' | ||||
|     # break nvenc.c:236,layout asm,step-mode,step,break *0x00007fff89f9ba45 | ||||
|     # libnvidia-encode.so @ 0x15a45; test->sub, jne->nop-nop-nop-nop-nop-nop | ||||
| ) | ||||
|  | ||||
| driver_version=$(/usr/bin/nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits) | ||||
| if [[ ! $? -eq 0 ]]; then | ||||
|     echo 'Something went wrong. Check nvidia driver' | ||||
|     exit 1; | ||||
| fi | ||||
|  | ||||
| echo "Detected nvidia driver version: $driver_version" | ||||
|  | ||||
| patch=${patch_list[$driver_version]} | ||||
|  | ||||
| if [[ ! $patch ]]; then | ||||
|     echo "Patch for this ($driver_version) nvidia driver not found." 1>&2 | ||||
|     echo "Available patches for: " 1>&2 | ||||
|     for drv in "${!patch_list[@]}"; do | ||||
|         echo "$drv" 1>&2 | ||||
|     done | ||||
|     exit 1; | ||||
| fi | ||||
|  | ||||
| if [[ $rollback_flag ]]; then | ||||
|     if [[ -f $backup_path/libnvidia-encode.so.$driver_version ]]; then | ||||
|         cp $backup_path/libnvidia-encode.so.$driver_version \ | ||||
|            /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.$driver_version | ||||
|         echo "Restore from backup libnvidia-encode.so.$driver_version" | ||||
|     else | ||||
|         echo "Backup not found. Try to patch first." | ||||
|         exit 1; | ||||
|     fi | ||||
| else | ||||
|     if [[ ! -f $backup_path/libnvidia-encode.so.$driver_version ]]; then | ||||
|         echo "Attention! Backup not found. Copy current libnvidia-encode to backup." | ||||
|         mkdir -p $backup_path | ||||
|         cp /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.$driver_version \ | ||||
|            $backup_path/libnvidia-encode.so.$driver_version | ||||
|     fi | ||||
|     sha1sum $backup_path/libnvidia-encode.so.$driver_version | ||||
|     sed "$patch" $backup_path/libnvidia-encode.so.$driver_version > \ | ||||
|       /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.$driver_version | ||||
|     sha1sum /usr/lib/x86_64-linux-gnu/libnvidia-encode.so.$driver_version | ||||
|     ldconfig | ||||
|     echo "Patched!" | ||||
| fi | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alexey Strekalovskiy
					Alexey Strekalovskiy