mirror of
https://github.com/keylase/nvidia-patch.git
synced 2025-08-21 22:03:12 -07:00
feat: add NVENC multi-session test script and documentation
This commit is contained in:
parent
151f853eee
commit
9d3794b9b5
2 changed files with 204 additions and 0 deletions
106
tools/patch-tester/NVENC_TEST_README.md
Normal file
106
tools/patch-tester/NVENC_TEST_README.md
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
# NVENC Multi-Session Test Script
|
||||||
|
|
||||||
|
This script demonstrates and tests NVIDIA NVENC hardware encoding capabilities with the NVENC patch. It allows running multiple simultaneous encoding sessions, beyond the default limit of 2 sessions on consumer GPUs.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Test multiple simultaneous NVENC encoding sessions
|
||||||
|
- Support for H.264, HEVC (H.265), and AV1 NVENC encoders
|
||||||
|
- Configurable encoding parameters (resolution, bitrate, framerate, etc.)
|
||||||
|
- Detailed performance metrics for each session
|
||||||
|
- Session statistics reporting (file size and encoding speed)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- NVIDIA GPU with NVENC support
|
||||||
|
- NVIDIA drivers with NVENC patch applied
|
||||||
|
- FFmpeg compiled with NVENC support
|
||||||
|
- Linux operating system
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./test_nvenc.sh [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
- `-n NUMBER` : Number of simultaneous sessions (default: 8)
|
||||||
|
- `-d DURATION` : Test duration in seconds (default: 10)
|
||||||
|
- `-r RES` : Resolution in WxH format (default: 1920x1080)
|
||||||
|
- `-f FPS` : Framerate (default: 30)
|
||||||
|
- `-b BITRATE` : Target bitrate (default: 5M)
|
||||||
|
- `-p PRESET` : NVENC preset p1-p7 (default: p7)
|
||||||
|
- `-c CODEC` : Encoder codec (h264_nvenc, hevc_nvenc, av1_nvenc) (default: h264_nvenc)
|
||||||
|
- `-h` : Display help message
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
1. Basic test with default settings:
|
||||||
|
```bash
|
||||||
|
./test_nvenc.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Test 12 simultaneous H.264 sessions:
|
||||||
|
```bash
|
||||||
|
./test_nvenc.sh -n 12
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Test HEVC encoding with custom parameters:
|
||||||
|
```bash
|
||||||
|
./test_nvenc.sh -c hevc_nvenc -r 3840x2160 -b 20M -p p7
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Test AV1 encoding:
|
||||||
|
```bash
|
||||||
|
./test_nvenc.sh -c av1_nvenc -n 4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
The script generates:
|
||||||
|
1. Encoded video files (`output_1.mp4`, `output_2.mp4`, etc.)
|
||||||
|
2. Session log files with detailed encoding statistics (`session_1.log`, `session_2.log`, etc.)
|
||||||
|
3. Summary of encoding statistics including file sizes and encoding speeds
|
||||||
|
|
||||||
|
## Performance Metrics
|
||||||
|
|
||||||
|
The script reports two key metrics for each session:
|
||||||
|
1. Output file size
|
||||||
|
2. Encoding speed (relative to real-time, e.g., 6.5x means 6.5 times faster than real-time)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
1. Without the NVENC patch, consumer NVIDIA GPUs are limited to 2 simultaneous encoding sessions.
|
||||||
|
2. The actual number of possible simultaneous sessions depends on:
|
||||||
|
- GPU model and capabilities
|
||||||
|
- Available GPU memory
|
||||||
|
- Encoding parameters (resolution, bitrate, etc.)
|
||||||
|
- System resources
|
||||||
|
|
||||||
|
3. Performance considerations:
|
||||||
|
- Encoding speed typically decreases as the number of simultaneous sessions increases
|
||||||
|
- The p7 preset provides the best quality but slowest encoding speed
|
||||||
|
- p1 preset offers the fastest encoding with lower quality
|
||||||
|
- Higher resolutions and bitrates require more GPU resources
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
1. If sessions fail to start, check:
|
||||||
|
- NVIDIA driver installation
|
||||||
|
- NVENC patch status
|
||||||
|
- FFmpeg NVENC support
|
||||||
|
- GPU resource usage
|
||||||
|
|
||||||
|
2. If performance is poor, try:
|
||||||
|
- Reducing the number of simultaneous sessions
|
||||||
|
- Using a faster preset (p1-p3)
|
||||||
|
- Lowering resolution or bitrate
|
||||||
|
- Checking GPU temperature and utilization
|
||||||
|
|
||||||
|
## Cleanup
|
||||||
|
|
||||||
|
To remove all test files:
|
||||||
|
```bash
|
||||||
|
rm -f output_*.mp4 session_*.log
|
||||||
|
```
|
98
tools/patch-tester/test_nvenc.sh
Executable file
98
tools/patch-tester/test_nvenc.sh
Executable file
|
@ -0,0 +1,98 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# NVENC Multi-Session Test Script
|
||||||
|
# This script tests NVIDIA NVENC hardware encoding capabilities by running multiple simultaneous encoding sessions.
|
||||||
|
# It demonstrates the removal of the 2-session limit on consumer GPUs through the NVENC patch.
|
||||||
|
|
||||||
|
# Default settings
|
||||||
|
DURATION=10
|
||||||
|
RESOLUTION="1920x1080"
|
||||||
|
FRAMERATE=30
|
||||||
|
BITRATE="5M"
|
||||||
|
NUM_SESSIONS=8
|
||||||
|
PRESET="p7" # p1 (fastest) to p7 (slowest)
|
||||||
|
CODEC="h264_nvenc" # can be h264_nvenc, hevc_nvenc, or av1_nvenc
|
||||||
|
|
||||||
|
# Function to display script usage
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo "Options:"
|
||||||
|
echo " -n NUMBER Number of simultaneous sessions (default: 8)"
|
||||||
|
echo " -d DURATION Test duration in seconds (default: 10)"
|
||||||
|
echo " -r RES Resolution in WxH format (default: 1920x1080)"
|
||||||
|
echo " -f FPS Framerate (default: 30)"
|
||||||
|
echo " -b BITRATE Target bitrate (default: 5M)"
|
||||||
|
echo " -p PRESET NVENC preset p1-p7 (default: p7)"
|
||||||
|
echo " -c CODEC Encoder codec (h264_nvenc, hevc_nvenc, av1_nvenc) (default: h264_nvenc)"
|
||||||
|
echo " -h Display this help message"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while getopts "n:d:r:f:b:p:c:h" opt; do
|
||||||
|
case $opt in
|
||||||
|
n) NUM_SESSIONS="$OPTARG" ;;
|
||||||
|
d) DURATION="$OPTARG" ;;
|
||||||
|
r) RESOLUTION="$OPTARG" ;;
|
||||||
|
f) FRAMERATE="$OPTARG" ;;
|
||||||
|
b) BITRATE="$OPTARG" ;;
|
||||||
|
p) PRESET="$OPTARG" ;;
|
||||||
|
c) CODEC="$OPTARG" ;;
|
||||||
|
h) usage; exit 0 ;;
|
||||||
|
?) usage; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Function to start an encoding session
|
||||||
|
encode_session() {
|
||||||
|
local session_num=$1
|
||||||
|
local output_file="output_${session_num}.mp4"
|
||||||
|
local log_file="session_${session_num}.log"
|
||||||
|
|
||||||
|
# Add session info to the test pattern
|
||||||
|
local text="Session ${session_num} - ${CODEC} - ${PRESET}"
|
||||||
|
|
||||||
|
ffmpeg -f lavfi -i "testsrc=duration=${DURATION}:size=${RESOLUTION}:rate=${FRAMERATE}" \
|
||||||
|
-c:v "${CODEC}" \
|
||||||
|
-preset "${PRESET}" \
|
||||||
|
-b:v "${BITRATE}" \
|
||||||
|
-y "${output_file}" > "${log_file}" 2>&1 &
|
||||||
|
|
||||||
|
echo "Started session $session_num (PID: $!)"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Starting multiple NVENC encoding sessions..."
|
||||||
|
echo "Configuration:"
|
||||||
|
echo "- Number of sessions: ${NUM_SESSIONS}"
|
||||||
|
echo "- Resolution: ${RESOLUTION}"
|
||||||
|
echo "- Framerate: ${FRAMERATE}"
|
||||||
|
echo "- Duration: ${DURATION}s"
|
||||||
|
echo "- Bitrate: ${BITRATE}"
|
||||||
|
echo "- Preset: ${PRESET}"
|
||||||
|
echo "- Codec: ${CODEC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Start encoding sessions
|
||||||
|
for i in $(seq 1 ${NUM_SESSIONS}); do
|
||||||
|
encode_session $i
|
||||||
|
sleep 1 # Brief pause between session starts
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wait for all sessions to complete
|
||||||
|
wait
|
||||||
|
|
||||||
|
echo -e "\nAll encoding sessions completed\n"
|
||||||
|
|
||||||
|
# Print session statistics
|
||||||
|
echo "Encoding Statistics:"
|
||||||
|
for i in $(seq 1 ${NUM_SESSIONS}); do
|
||||||
|
output_file="output_${i}.mp4"
|
||||||
|
log_file="session_${i}.log"
|
||||||
|
if [ -f "${output_file}" ]; then
|
||||||
|
size=$(du -h "${output_file}" | cut -f1)
|
||||||
|
# Extract encoding speed from log file
|
||||||
|
speed=$(grep "speed=" "${log_file}" | tail -n1 | sed 's/.*speed=\s*\([0-9.]*\)x/\1/')
|
||||||
|
echo "Session $i: Size=${size}, Speed=${speed}x"
|
||||||
|
else
|
||||||
|
echo "Session $i: Failed to create output file"
|
||||||
|
fi
|
||||||
|
done
|
Loading…
Add table
Add a link
Reference in a new issue