Hardware Architecture โ
The universal hardware optimization system provides automatic GPU detection, driver installation, and performance tuning across NVIDIA RTX, AMD RDNA, Intel Arc/QuickSync, and Raspberry Pi platforms. This architecture delivers real-world performance gains of 10-50x for transcoding workloads.
Design Philosophy โ
Universal Hardware Support โ
- Platform agnostic - Works with any GPU vendor or architecture
- Automatic optimization - Zero-configuration performance tuning
- Real-world focus - Measurable performance improvements
- Production ready - Stable drivers and proven configurations
Performance-First Approach โ
Hardware Optimization Goals:
โโโ Transcoding Performance
โ โโโ 4K HEVC: 2-5 FPS โ 60+ FPS (12-30x improvement)
โ โโโ Power efficiency: 200W CPU โ 50W GPU (75% reduction)
โ โโโ Concurrent streams: 1-2 โ 8+ streams (4-8x capacity)
โโโ System Responsiveness
โ โโโ Offload CPU-intensive tasks to GPU
โ โโโ Free up CPU for other services
โ โโโ Reduce thermal throttling
โโโ Energy Efficiency
โโโ GPU acceleration uses less power
โโโ Lower heat generation
โโโ Quieter operation
GPU Detection Architecture โ
Multi-Platform Detection System โ
bash
# Universal GPU detection with vendor-specific optimization
detect_gpu_capabilities() {
local detected_gpus=()
# Layer 1: Hardware detection
detect_nvidia_gpus detected_gpus
detect_amd_gpus detected_gpus
detect_intel_gpus detected_gpus
detect_raspberry_pi_gpu detected_gpus
# Layer 2: Driver verification
verify_gpu_drivers detected_gpus
# Layer 3: Capability analysis
analyze_gpu_capabilities detected_gpus
# Layer 4: Performance profiling
profile_gpu_performance detected_gpus
# Generate optimization recommendations
generate_hardware_recommendations detected_gpus
}
detect_nvidia_gpus() {
local -n gpus_ref=$1
# Check for NVIDIA GPUs via lspci
while IFS= read -r line; do
local pci_id gpu_name
pci_id=$(echo "$line" | awk '{print $1}')
gpu_name=$(echo "$line" | cut -d: -f3- | sed 's/^ *//')
# Get detailed GPU info
local gpu_info
gpu_info=$(get_nvidia_gpu_details "$pci_id")
gpus_ref+=("nvidia:$pci_id:$gpu_name:$gpu_info")
done < <(lspci | grep -i "vga.*nvidia\|3d.*nvidia\|display.*nvidia")
# Verify NVIDIA driver installation
if command -v nvidia-smi >/dev/null; then
local driver_version cuda_version
driver_version=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits | head -1)
cuda_version=$(nvidia-smi --query-gpu=cuda_version --format=csv,noheader,nounits | head -1 2>/dev/null || echo "N/A")
info "NVIDIA driver detected: $driver_version (CUDA: $cuda_version)"
fi
}
get_nvidia_gpu_details() {
local pci_id="$1"
local details=""
if command -v nvidia-smi >/dev/null; then
# Get GPU details from nvidia-smi
local memory_total memory_used gpu_util temp power
memory_total=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits)
memory_used=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits)
gpu_util=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits)
temp=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits)
power=$(nvidia-smi --query-gpu=power.draw --format=csv,noheader,nounits 2>/dev/null || echo "N/A")
# Check encoding capabilities
local nvenc_support nvdec_support
if nvidia-smi -q | grep -q "Encoder"; then
nvenc_support="yes"
else
nvenc_support="no"
fi
if nvidia-smi -q | grep -q "Decoder"; then
nvdec_support="yes"
else
nvdec_support="no"
fi
details="memory:${memory_total}MB,util:${gpu_util}%,temp:${temp}C,power:${power}W,nvenc:${nvenc_support},nvdec:${nvdec_support}"
else
details="driver:not_installed"
fi
echo "$details"
}
detect_amd_gpus() {
local -n gpus_ref=$1
# Check for AMD GPUs via lspci
while IFS= read -r line; do
local pci_id gpu_name
pci_id=$(echo "$line" | awk '{print $1}')
gpu_name=$(echo "$line" | cut -d: -f3- | sed 's/^ *//')
# Get detailed GPU info
local gpu_info
gpu_info=$(get_amd_gpu_details "$pci_id")
gpus_ref+=("amd:$pci_id:$gpu_name:$gpu_info")
done < <(lspci | grep -i "vga.*amd\|3d.*amd\|display.*amd\|vga.*ati\|3d.*ati")
# Verify VAAPI support
if command -v vainfo >/dev/null; then
local vaapi_info
vaapi_info=$(vainfo 2>/dev/null | grep -E "VAProfile|VAEntrypoint" | wc -l)
if [[ $vaapi_info -gt 0 ]]; then
info "AMD VAAPI detected: $vaapi_info profiles available"
fi
fi
}
get_amd_gpu_details() {
local pci_id="$1"
local details=""
# Check for AMD GPU monitoring tools
if command -v radeontop >/dev/null 2>&1; then
# Get basic GPU info (radeontop requires root, so just check availability)
details="monitor:radeontop"
fi
# Check VAAPI capabilities
if command -v vainfo >/dev/null; then
local vaapi_profiles
vaapi_profiles=$(vainfo 2>/dev/null | grep "VAProfileH264" | wc -l)
local vaapi_hevc
vaapi_hevc=$(vainfo 2>/dev/null | grep "VAProfileHEVC" | wc -l)
details+=",vaapi_h264:${vaapi_profiles},vaapi_hevc:${vaapi_hevc}"
# Check for AMF support
if vainfo 2>/dev/null | grep -q "VAProfileH264High"; then
details+=",amf:available"
else
details+=",amf:unavailable"
fi
else
details+=",vaapi:not_installed"
fi
echo "$details"
}
detect_intel_gpus() {
local -n gpus_ref=$1
# Check for Intel integrated graphics
while IFS= read -r line; do
local pci_id gpu_name
pci_id=$(echo "$line" | awk '{print $1}')
gpu_name=$(echo "$line" | cut -d: -f3- | sed 's/^ *//')
# Get Intel GPU details
local gpu_info
gpu_info=$(get_intel_gpu_details "$pci_id")
gpus_ref+=("intel:$pci_id:$gpu_name:$gpu_info")
done < <(lspci | grep -i "vga.*intel\|3d.*intel\|display.*intel")
# Check for Intel QuickSync support
if command -v intel_gpu_top >/dev/null 2>&1; then
info "Intel GPU monitoring available"
fi
}
get_intel_gpu_details() {
local pci_id="$1"
local details=""
# Check for Intel media drivers
if [[ -d "/dev/dri" ]]; then
local render_nodes
render_nodes=$(ls /dev/dri/render* 2>/dev/null | wc -l)
details="render_nodes:$render_nodes"
fi
# Check QuickSync capabilities via VAAPI
if command -v vainfo >/dev/null; then
local quicksync_profiles
quicksync_profiles=$(vainfo 2>/dev/null | grep -E "VAProfile.*H264|VAProfile.*HEVC" | wc -l)
details+=",quicksync_profiles:$quicksync_profiles"
# Check for AV1 support (Intel Arc)
if vainfo 2>/dev/null | grep -q "VAProfileAV1"; then
details+=",av1:supported"
else
details+=",av1:not_supported"
fi
else
details+=",vaapi:not_installed"
fi
echo "$details"
}
detect_raspberry_pi_gpu() {
local -n gpus_ref=$1
# Check if running on Raspberry Pi
if [[ -f "/proc/device-tree/model" ]] && grep -q "Raspberry Pi" /proc/device-tree/model; then
local pi_model
pi_model=$(cat /proc/device-tree/model | tr -d '\0')
# Get VideoCore GPU info
local gpu_info
gpu_info=$(get_pi_gpu_details)
gpus_ref+=("raspberry_pi:videocore:$pi_model:$gpu_info")
info "Raspberry Pi detected: $pi_model"
fi
}
get_pi_gpu_details() {
local details=""
# Check GPU memory split
if command -v vcgencmd >/dev/null; then
local gpu_mem
gpu_mem=$(vcgencmd get_mem gpu 2>/dev/null | cut -d= -f2)
details="gpu_memory:$gpu_mem"
# Check GPU temperature
local gpu_temp
gpu_temp=$(vcgencmd measure_temp 2>/dev/null | cut -d= -f2)
details+=",temperature:$gpu_temp"
# Check for hardware acceleration support
if [[ -c "/dev/vchiq" ]]; then
details+=",hardware_decode:available"
else
details+=",hardware_decode:unavailable"
fi
fi
echo "$details"
}
Driver Installation System โ
Automatic Driver Installation โ
bash
# Universal driver installation with platform detection
install_optimal_drivers() {
local gpu_vendor="$1"
local force_install="${2:-false}"
info "Installing optimal drivers for $gpu_vendor GPU..."
case "$gpu_vendor" in
nvidia)
install_nvidia_drivers "$force_install"
;;
amd)
install_amd_drivers "$force_install"
;;
intel)
install_intel_drivers "$force_install"
;;
raspberry_pi)
configure_raspberry_pi_gpu "$force_install"
;;
*)
error "Unsupported GPU vendor: $gpu_vendor"
return 1
;;
esac
}
install_nvidia_drivers() {
local force_install="$1"
# Check if drivers already installed
if command -v nvidia-smi >/dev/null && [[ "$force_install" != "true" ]]; then
local current_version
current_version=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits | head -1)
warning "NVIDIA drivers already installed: $current_version"
read -p "Reinstall anyway? (y/N): " -r confirm
[[ $confirm =~ ^[Yy]$ ]] || return 0
fi
local os_type
os_type=$(get_os_type)
case "$os_type" in
ubuntu|debian)
install_nvidia_drivers_apt
;;
centos|rhel|fedora)
install_nvidia_drivers_yum
;;
arch)
install_nvidia_drivers_pacman
;;
*)
error "Unsupported OS for automatic NVIDIA driver installation: $os_type"
return 1
;;
esac
# Install Docker GPU support
install_nvidia_docker_support
# Test installation
test_nvidia_installation
}
install_nvidia_drivers_apt() {
info "Installing NVIDIA drivers via APT..."
# Add NVIDIA repository
if ! apt-cache policy | grep -q "nvidia"; then
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:graphics-drivers/ppa
sudo apt-get update
fi
# Detect recommended driver
local recommended_driver
recommended_driver=$(ubuntu-drivers devices | grep recommended | awk '{print $3}' | head -1)
if [[ -z "$recommended_driver" ]]; then
# Fallback to latest stable
recommended_driver="nvidia-driver-545"
warning "Could not detect recommended driver, using: $recommended_driver"
fi
info "Installing driver: $recommended_driver"
# Install driver and related packages
sudo apt-get install -y \
"$recommended_driver" \
nvidia-cuda-toolkit \
nvidia-settings \
nvidia-prime
success "NVIDIA drivers installed: $recommended_driver"
}
install_nvidia_docker_support() {
info "Installing NVIDIA Docker support..."
# Add NVIDIA Docker repository
local repo_url="https://nvidia.github.io/libnvidia-container"
case "$(get_os_type)" in
ubuntu|debian)
# Add GPG key
curl -fsSL "$repo_url/gpgkey" | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
# Add repository
curl -s -L "$repo_url/stable/deb/nvidia-container-toolkit.list" | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install package
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
;;
centos|rhel|fedora)
# Add repository
curl -s -L "$repo_url/stable/rpm/nvidia-container-toolkit.repo" | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
# Install package
sudo dnf install -y nvidia-container-toolkit
;;
esac
# Configure Docker daemon
configure_docker_nvidia_runtime
success "NVIDIA Docker support installed"
}
configure_docker_nvidia_runtime() {
local daemon_config="/etc/docker/daemon.json"
local backup_config="${daemon_config}.backup.$(date +%s)"
# Backup existing configuration
if [[ -f "$daemon_config" ]]; then
sudo cp "$daemon_config" "$backup_config"
info "Docker daemon config backed up: $backup_config"
fi
# Generate new configuration
local config_content
if [[ -f "$daemon_config" ]]; then
# Merge with existing config
config_content=$(jq '. + {"runtimes": {"nvidia": {"path": "nvidia-container-runtime", "runtimeArgs": []}}}' "$daemon_config")
else
# Create new config
config_content='{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "runc"
}'
fi
# Write configuration
echo "$config_content" | sudo tee "$daemon_config" >/dev/null
# Restart Docker daemon
sudo systemctl restart docker
# Wait for Docker to be ready
sleep 5
success "Docker NVIDIA runtime configured"
}
test_nvidia_installation() {
info "Testing NVIDIA installation..."
# Test nvidia-smi
if ! nvidia-smi >/dev/null 2>&1; then
error "nvidia-smi test failed"
return 1
fi
# Test Docker GPU access
if ! docker run --rm --gpus all nvidia/cuda:11.0-base-ubuntu20.04 nvidia-smi >/dev/null 2>&1; then
error "Docker GPU access test failed"
return 1
fi
# Test encoding capabilities
local nvenc_test
if nvenc_test=$(nvidia-smi -q | grep -c "Encoder"); then
info "NVENC encoders detected: $nvenc_test"
fi
local nvdec_test
if nvdec_test=$(nvidia-smi -q | grep -c "Decoder"); then
info "NVDEC decoders detected: $nvdec_test"
fi
success "NVIDIA installation test passed"
return 0
}
Performance Optimization Engine โ
Hardware-Specific Optimization โ
bash
# Generate optimized configurations based on detected hardware
generate_hardware_optimizations() {
local detected_gpus=("$@")
info "Generating hardware optimizations..."
# Analyze GPU capabilities
local optimization_profile
optimization_profile=$(analyze_optimal_profile "${detected_gpus[@]}")
# Generate Docker Compose optimizations
generate_compose_optimizations "$optimization_profile" "${detected_gpus[@]}"
# Generate service-specific configurations
generate_service_optimizations "$optimization_profile" "${detected_gpus[@]}"
# Generate FFmpeg profiles
generate_ffmpeg_profiles "${detected_gpus[@]}"
success "Hardware optimizations generated"
}
analyze_optimal_profile() {
local detected_gpus=("$@")
local total_cpu total_memory gpu_memory gpu_performance
# Get system resources
total_cpu=$(nproc)
total_memory=$(get_total_memory_gb)
# Analyze GPU capabilities
gpu_memory=0
gpu_performance=0
for gpu in "${detected_gpus[@]}"; do
local vendor gpu_info
vendor=$(echo "$gpu" | cut -d: -f1)
gpu_info=$(echo "$gpu" | cut -d: -f4)
case "$vendor" in
nvidia)
local mem
mem=$(echo "$gpu_info" | grep -o "memory:[0-9]*" | cut -d: -f2)
gpu_memory=$((gpu_memory + ${mem:-0}))
gpu_performance=$((gpu_performance + 100)) # NVIDIA gets high score
;;
amd)
gpu_performance=$((gpu_performance + 80)) # AMD gets good score
;;
intel)
gpu_performance=$((gpu_performance + 60)) # Intel gets moderate score
;;
raspberry_pi)
gpu_performance=$((gpu_performance + 30)) # Pi gets low score
;;
esac
done
# Determine optimal profile
if [[ $total_memory -ge 32 && $gpu_performance -ge 100 ]]; then
echo "dedicated"
elif [[ $total_memory -ge 16 && $gpu_performance -ge 60 ]]; then
echo "high"
elif [[ $total_memory -ge 8 && $gpu_performance -ge 30 ]]; then
echo "balanced"
else
echo "light"
fi
}
generate_compose_optimizations() {
local profile="$1"
shift
local detected_gpus=("$@")
local compose_file="docker-compose.optimized.yml"
local temp_file="${compose_file}.tmp"
# Generate header
{
echo "# Hardware-optimized configurations"
echo "# Profile: $profile"
echo "# Generated on $(date)"
echo
echo "version: '3.8'"
echo
echo "services:"
} > "$temp_file"
# Generate service optimizations
generate_jellyfin_optimizations "$profile" "${detected_gpus[@]}" >> "$temp_file"
generate_tdarr_optimizations "$profile" "${detected_gpus[@]}" >> "$temp_file"
generate_arr_optimizations "$profile" >> "$temp_file"
# Atomic replacement
mv "$temp_file" "$compose_file"
success "Generated Docker Compose optimizations: $compose_file"
}
generate_jellyfin_optimizations() {
local profile="$1"
shift
local detected_gpus=("$@")
echo " jellyfin:"
# Resource limits based on profile
case "$profile" in
dedicated)
echo " deploy:"
echo " resources:"
echo " limits:"
echo " memory: 8G"
echo " cpus: '4'"
echo " reservations:"
echo " memory: 2G"
echo " cpus: '1'"
;;
high)
echo " deploy:"
echo " resources:"
echo " limits:"
echo " memory: 6G"
echo " cpus: '3'"
echo " reservations:"
echo " memory: 1G"
echo " cpus: '0.5'"
;;
balanced)
echo " deploy:"
echo " resources:"
echo " limits:"
echo " memory: 4G"
echo " cpus: '2'"
echo " reservations:"
echo " memory: 512M"
;;
esac
# GPU configuration
for gpu in "${detected_gpus[@]}"; do
local vendor
vendor=$(echo "$gpu" | cut -d: -f1)
case "$vendor" in
nvidia)
echo " reservations:"
echo " devices:"
echo " - driver: nvidia"
echo " count: 1"
echo " capabilities: [gpu]"
echo " environment:"
echo " - NVIDIA_VISIBLE_DEVICES=all"
echo " - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility"
break
;;
amd|intel)
echo " devices:"
echo " - /dev/dri:/dev/dri"
echo " environment:"
echo " - VAAPI_DEVICE=/dev/dri/renderD128"
break
;;
esac
done
echo
}
generate_ffmpeg_profiles() {
local detected_gpus=("$@")
local profiles_dir="./config/ffmpeg_profiles"
mkdir -p "$profiles_dir"
for gpu in "${detected_gpus[@]}"; do
local vendor gpu_name
vendor=$(echo "$gpu" | cut -d: -f1)
gpu_name=$(echo "$gpu" | cut -d: -f3)
case "$vendor" in
nvidia)
generate_nvidia_ffmpeg_profiles "$profiles_dir" "$gpu_name"
;;
amd)
generate_amd_ffmpeg_profiles "$profiles_dir" "$gpu_name"
;;
intel)
generate_intel_ffmpeg_profiles "$profiles_dir" "$gpu_name"
;;
esac
done
success "Generated FFmpeg profiles: $profiles_dir"
}
generate_nvidia_ffmpeg_profiles() {
local profiles_dir="$1"
local gpu_name="$2"
# NVENC H.264 profile
cat > "$profiles_dir/nvidia_h264.json" << 'EOF'
{
"name": "NVIDIA H.264 Hardware Encoding",
"codec": "h264_nvenc",
"hardware_acceleration": true,
"parameters": {
"preset": "fast",
"profile": "high",
"level": "4.1",
"crf": "23",
"b_ref_mode": "middle",
"temporal_aq": "1",
"rc": "vbr",
"maxrate": "8M",
"bufsize": "16M"
}
}
EOF
# NVENC HEVC profile
cat > "$profiles_dir/nvidia_hevc.json" << 'EOF'
{
"name": "NVIDIA HEVC Hardware Encoding",
"codec": "hevc_nvenc",
"hardware_acceleration": true,
"parameters": {
"preset": "fast",
"profile": "main",
"crf": "28",
"tier": "main",
"rc": "vbr",
"maxrate": "6M",
"bufsize": "12M"
}
}
EOF
info "Generated NVIDIA FFmpeg profiles"
}
Performance Benchmarking โ
Real-World Performance Testing โ
bash
# Comprehensive transcoding benchmark
benchmark_transcoding_performance() {
local test_duration="${1:-60}" # seconds
local test_resolution="${2:-1080p}"
info "Running transcoding performance benchmark..."
# Create test video if needed
local test_file
test_file=$(create_test_video "$test_resolution")
# Test CPU-only transcoding
local cpu_results
cpu_results=$(benchmark_cpu_transcoding "$test_file" "$test_duration")
# Test GPU-accelerated transcoding
local gpu_results
gpu_results=$(benchmark_gpu_transcoding "$test_file" "$test_duration")
# Compare results
compare_benchmark_results "$cpu_results" "$gpu_results"
# Cleanup
rm -f "$test_file"
}
benchmark_cpu_transcoding() {
local input_file="$1"
local duration="$2"
local output_file="/tmp/cpu_test_output.mp4"
info "Benchmarking CPU transcoding..."
# Record start time and system stats
local start_time cpu_start_temp power_start
start_time=$(date +%s)
cpu_start_temp=$(get_cpu_temperature)
power_start=$(get_system_power_usage)
# Run FFmpeg CPU transcoding
timeout "$duration" ffmpeg -y \
-i "$input_file" \
-c:v libx264 \
-preset medium \
-crf 23 \
-c:a aac \
-b:a 128k \
"$output_file" 2>/dev/null || true
# Record end stats
local end_time cpu_end_temp power_end frames_processed
end_time=$(date +%s)
cpu_end_temp=$(get_cpu_temperature)
power_end=$(get_system_power_usage)
# Calculate frames processed
frames_processed=$(get_frames_processed "$output_file")
# Calculate metrics
local elapsed_time fps avg_power temp_delta
elapsed_time=$((end_time - start_time))
fps=$(echo "scale=2; $frames_processed / $elapsed_time" | bc -l)
avg_power=$(echo "scale=2; ($power_start + $power_end) / 2" | bc -l)
temp_delta=$((cpu_end_temp - cpu_start_temp))
# Cleanup
rm -f "$output_file"
echo "cpu:$fps:$avg_power:$temp_delta:$elapsed_time"
}
benchmark_gpu_transcoding() {
local input_file="$1"
local duration="$2"
local output_file="/tmp/gpu_test_output.mp4"
info "Benchmarking GPU transcoding..."
# Detect GPU type and use appropriate encoder
local encoder
if command -v nvidia-smi >/dev/null; then
encoder="h264_nvenc"
elif command -v vainfo >/dev/null; then
encoder="h264_vaapi"
else
warning "No GPU encoder detected, skipping GPU benchmark"
echo "gpu:0:0:0:0"
return 1
fi
# Record start time and system stats
local start_time gpu_start_temp gpu_start_util power_start
start_time=$(date +%s)
gpu_start_temp=$(get_gpu_temperature)
gpu_start_util=$(get_gpu_utilization)
power_start=$(get_system_power_usage)
# Run FFmpeg GPU transcoding
local ffmpeg_args=()
case "$encoder" in
h264_nvenc)
ffmpeg_args=(
-hwaccel cuda
-hwaccel_output_format cuda
-c:v "$encoder"
-preset fast
-crf 23
)
;;
h264_vaapi)
ffmpeg_args=(
-vaapi_device /dev/dri/renderD128
-hwaccel vaapi
-hwaccel_output_format vaapi
-c:v "$encoder"
-qp 23
)
;;
esac
timeout "$duration" ffmpeg -y \
-i "$input_file" \
"${ffmpeg_args[@]}" \
-c:a aac \
-b:a 128k \
"$output_file" 2>/dev/null || true
# Record end stats
local end_time gpu_end_temp gpu_end_util power_end frames_processed
end_time=$(date +%s)
gpu_end_temp=$(get_gpu_temperature)
gpu_end_util=$(get_gpu_utilization)
power_end=$(get_system_power_usage)
# Calculate frames processed
frames_processed=$(get_frames_processed "$output_file")
# Calculate metrics
local elapsed_time fps avg_power temp_delta avg_util
elapsed_time=$((end_time - start_time))
fps=$(echo "scale=2; $frames_processed / $elapsed_time" | bc -l)
avg_power=$(echo "scale=2; ($power_start + $power_end) / 2" | bc -l)
temp_delta=$((gpu_end_temp - gpu_start_temp))
avg_util=$(echo "scale=2; ($gpu_start_util + $gpu_end_util) / 2" | bc -l)
# Cleanup
rm -f "$output_file"
echo "gpu:$fps:$avg_power:$temp_delta:$elapsed_time:$avg_util"
}
compare_benchmark_results() {
local cpu_results="$1"
local gpu_results="$2"
# Parse results
local cpu_fps cpu_power gpu_fps gpu_power
cpu_fps=$(echo "$cpu_results" | cut -d: -f2)
cpu_power=$(echo "$cpu_results" | cut -d: -f3)
gpu_fps=$(echo "$gpu_results" | cut -d: -f2)
gpu_power=$(echo "$gpu_results" | cut -d: -f3)
# Calculate improvements
local fps_improvement power_improvement
fps_improvement=$(echo "scale=1; $gpu_fps / $cpu_fps" | bc -l)
power_improvement=$(echo "scale.1; (($cpu_power - $gpu_power) / $cpu_power) * 100" | bc -l)
# Display results
echo
success "๐งช TRANSCODING PERFORMANCE BENCHMARK"
echo "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
echo
printf "%-20s %-10s %-12s %-15s\n" "Method" "FPS" "Power (W)" "Performance"
echo "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
printf "%-20s %-10s %-12s %-15s\n" "CPU-only" "$cpu_fps" "$cpu_power" "Baseline"
printf "%-20s %-10s %-12s %-15s\n" "GPU-accelerated" "$gpu_fps" "$gpu_power" "${fps_improvement}x faster"
echo
printf "๐ก Performance improvement: %.1fx faster transcoding\n" "$fps_improvement"
printf "โก Power efficiency: %.1f%% power reduction\n" "$power_improvement"
echo
}
Related Documentation โ
- Architecture Overview - System design principles
- CLI Design - Hardware command implementation
- Service Architecture - GPU integration with services
- Storage Architecture - Storage performance optimization
- Network Architecture - Hardware monitoring and management