175 lines
5.9 KiB
Markdown
175 lines
5.9 KiB
Markdown
# VKZip - GPU-Accelerated File Compressor/Decompressor
|
|
|
|
```
|
|
██╗ ██╗██╗ ██╗███████╗██╗██████╗
|
|
██║ ██║██║ ██╔╝╚══███╔╝██║██╔══██╗
|
|
██║ ██║█████╔╝ ███╔╝ ██║██████╔╝
|
|
╚██╗ ██╔╝██╔═██╗ ███╔╝ ██║██╔═══╝
|
|
╚████╔╝ ██║ ██╗███████╗██║██║
|
|
╚═══╝ ╚═╝ ╚═╝╚══════╝╚═╝╚═╝
|
|
```
|
|
|
|
> **Compressão de arquivos acelerada por GPU usando Vulkan Compute Shaders**
|
|
|
|
## ✨ Características
|
|
|
|
- 🚀 **Aceleração GPU** via Vulkan Compute Shaders
|
|
- 🖥️ **Cross-platform** - Windows e Linux
|
|
- 🎮 **Multi-GPU** - NVIDIA, AMD, Intel (qualquer GPU Vulkan)
|
|
- 🔄 **CPU Fallback** - Funciona mesmo sem GPU compatível
|
|
- 📊 **Benchmark** - Compare GPU vs CPU no seu hardware
|
|
- 🔒 **CRC32** - Verificação de integridade dos dados
|
|
- 📦 **Formato .vkz** - Formato próprio otimizado para compressão paralela
|
|
|
|
## 📋 Requisitos
|
|
|
|
### Linux
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt install cmake build-essential vulkan-tools libvulkan-dev glslang-tools
|
|
|
|
# Arch Linux
|
|
sudo pacman -S cmake vulkan-tools vulkan-headers vulkan-icd-loader glslang
|
|
|
|
# Fedora
|
|
sudo dnf install cmake gcc vulkan-tools vulkan-loader-devel glslang
|
|
```
|
|
|
|
### Windows
|
|
1. Instale o [Vulkan SDK](https://vulkan.lunarg.com/sdk/home)
|
|
2. Instale o [CMake](https://cmake.org/download/)
|
|
3. Instale o [Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/) (ou MinGW)
|
|
|
|
## 🔨 Compilação
|
|
|
|
```bash
|
|
# Clonar e entrar no diretório
|
|
cd winrarcomgpu
|
|
|
|
# Criar diretório de build
|
|
mkdir build && cd build
|
|
|
|
# Configurar
|
|
cmake ..
|
|
|
|
# Compilar
|
|
cmake --build . --config Release
|
|
|
|
# (Opcional) Instalar
|
|
sudo cmake --install .
|
|
```
|
|
|
|
### Windows (MSVC)
|
|
```cmd
|
|
mkdir build && cd build
|
|
cmake .. -G "Visual Studio 17 2022"
|
|
cmake --build . --config Release
|
|
```
|
|
|
|
## 🚀 Uso
|
|
|
|
### Compactar arquivo
|
|
```bash
|
|
vkzip compress arquivo.dat # → arquivo.dat.vkz
|
|
vkzip compress arquivo.dat saida.vkz # Nome personalizado
|
|
vkzip compress arquivo.dat --block-size 128 # Blocos de 128KB
|
|
vkzip c arquivo.dat # Atalho
|
|
```
|
|
|
|
### Descompactar arquivo
|
|
```bash
|
|
vkzip decompress arquivo.vkz # → restaura nome original
|
|
vkzip decompress arquivo.vkz saida.dat # Nome personalizado
|
|
vkzip d arquivo.vkz # Atalho
|
|
vkzip x arquivo.vkz # Atalho alternativo
|
|
```
|
|
|
|
### Informações do arquivo
|
|
```bash
|
|
vkzip info arquivo.vkz # Detalhes do arquivo
|
|
vkzip i arquivo.vkz # Atalho
|
|
```
|
|
|
|
### Benchmark GPU vs CPU
|
|
```bash
|
|
vkzip benchmark arquivo_grande.dat # Compara GPU vs CPU
|
|
vkzip bench arquivo_grande.dat # Atalho
|
|
```
|
|
|
|
### Informações da GPU
|
|
```bash
|
|
vkzip --gpu-info # Mostra info da GPU
|
|
```
|
|
|
|
### Opções
|
|
```bash
|
|
--cpu-only Forçar modo CPU (sem GPU)
|
|
--block-size N Tamanho do bloco em KB (padrão: 64, min: 4, max: 1024)
|
|
```
|
|
|
|
## ⚙️ Como Funciona
|
|
|
|
### Algoritmo de Compressão
|
|
|
|
1. **Divisão em Blocos**: O arquivo é dividido em blocos independentes (64KB por padrão)
|
|
2. **Upload GPU**: Todos os blocos são enviados para memória da GPU
|
|
3. **Compressão Paralela**: Cada bloco é comprimido em paralelo por um workgroup do GPU
|
|
- Usa LZ77 (match-finding com hash table)
|
|
- Cada match é codificado como `(distância, comprimento)`
|
|
- Bytes sem match são armazenados como literais
|
|
4. **Download**: Dados comprimidos são lidos de volta da GPU
|
|
5. **Empacotamento**: Blocos comprimidos + header = arquivo `.vkz`
|
|
|
|
### Formato .vkz
|
|
|
|
```
|
|
┌──────────────────────────────────┐
|
|
│ Header (28 bytes) │
|
|
│ Magic: "VKZ\0" │
|
|
│ Version, Size, Block info │
|
|
├──────────────────────────────────┤
|
|
│ Block Table │
|
|
│ Offset, Size, CRC per block │
|
|
├──────────────────────────────────┤
|
|
│ Original Filename │
|
|
├──────────────────────────────────┤
|
|
│ Compressed Block 0 │
|
|
│ Compressed Block 1 │
|
|
│ ... │
|
|
│ Compressed Block N │
|
|
└──────────────────────────────────┘
|
|
```
|
|
|
|
## 📊 Performance
|
|
|
|
A vantagem da GPU aparece principalmente em:
|
|
- **Arquivos grandes** (>10MB) com muitos blocos paralelos
|
|
- **GPUs potentes** com muitos compute units
|
|
- **Dados com boa compressibilidade** (texto, logs, dados estruturados)
|
|
|
|
Para arquivos pequenos, o overhead de transferência CPU↔GPU pode tornar o CPU mais rápido.
|
|
|
|
## 🏗️ Estrutura do Projeto
|
|
|
|
```
|
|
winrarcomgpu/
|
|
├── CMakeLists.txt # Build system
|
|
├── README.md # Este arquivo
|
|
├── src/
|
|
│ ├── main.c # CLI entry point
|
|
│ ├── utils.h # Utilitários e constantes
|
|
│ ├── vkz_format.h/c # Formato do arquivo .vkz
|
|
│ ├── gpu_context.h/c # Inicialização Vulkan
|
|
│ ├── gpu_compress.h/c # Pipeline de compressão GPU
|
|
│ ├── gpu_decompress.h/c # Pipeline de descompressão GPU
|
|
│ └── cpu_fallback.h/c # Fallback CPU
|
|
└── shaders/
|
|
├── compress.comp # Compute shader de compressão
|
|
├── decompress.comp # Compute shader de descompressão
|
|
└── compile_shaders.sh # Script de compilação
|
|
```
|
|
|
|
## 📄 Licença
|
|
|
|
MIT License - Use livremente!
|