Aula 19: I/O Mapeado em Memória vs I/O Bufferizado
Ao carregar datasets de vários gigabytes para treinar GPUs, cada milissegundo de I/O importa. Existem três abordagens principais: buffered I/O (stdio), mmap, que mapeia um arquivo diretamente na memória virtual, e sendfile para rede com zero-copy. Na NVIDIA, ao carregar pesos de modelo e batches de
buffered read é como pegar livros emprestados da biblioteca e fotocopiá-los antes de usar. mmap é como sentar direto na biblioteca — sem cópia, lendo do original. sendfile é como enviar um livro da biblioteca diretamente para um amigo sem você nunca tocar nele.
- buffered I/O
- I/O através do stdio (fread, fwrite) que acumula dados em um buffer no user space antes de transferir para o kernel. Reduz chamadas de sistema, mas adiciona uma cópia extra de dados.
- direct I/O
- I/O que ignora o page cache do kernel. Ativado com O_DIRECT. Exige que o buffer esteja alinhado a 512 bytes. Útil quando o programa gerencia seu próprio cache.
- zero-copy
- Uma técnica de I/O que transfere dados diretamente entre buffers do kernel sem copiar para o user space. sendfile() e mmap são duas implementações comuns.
- sendfile
- Chamada de sistema que transfere dados de um FD de arquivo para um FD de socket diretamente dentro do kernel — sem copiar para o user space. Usada no Nginx e em web servers para servir arquivos estáticos.
- page cache
- Um buffer em RAM mantido pelo kernel que armazena o conteúdo de arquivos acessados recentemente. Leituras repetidas do mesmo arquivo são atendidas pela RAM em vez do disco.