39
LibNUMA Cleverson Lopes Ledur Prof. Dr. Luiz Gustavo L. Fernandes Programação Paralela PPGCC - PUCRS Afinidade de Memória e CPU 10/2014

Libnuma - Afinidade de Memória e CPU

Embed Size (px)

Citation preview

Page 1: Libnuma - Afinidade de Memória e CPU

LibNUMA

Cleverson Lopes LedurProf. Dr. Luiz Gustavo L. Fernandes Programação ParalelaPPGCC - PUCRS

Afinidade de Memória e CPU

10/2014

Page 2: Libnuma - Afinidade de Memória e CPU

Resumo

● Revisão Arquiteturas○ SMP○ Arquiteturas UMA e NUMA○ Afinidade de Memória○ Afinidade de CPU

● API NUMA● LibNuma● Mai● Comparação Libnuma vs. Mai● Conclusão

Page 3: Libnuma - Afinidade de Memória e CPU

Revisando Algumas Arquiteturas

Page 4: Libnuma - Afinidade de Memória e CPU

SMP (Symmetric Multiprocessor)

No modelo SMP, o computador possui um único controlador de memória que é compartilhado por todos os processadores.

Page 5: Libnuma - Afinidade de Memória e CPU

UMA (Unified Memory Access)

● Unified Memory Access

● Memória se torna um gargalo

● Aumento do número de processadores compromete a escalabilidade.

● Mesmo tempo de acesso à memória.

Page 6: Libnuma - Afinidade de Memória e CPU

NUMA (Non Unified Memory Access)

● A memória é distribuída entre os processadores.

● A memória pode ser endereçada localmente ou remotamente.

● Tempo de acesso à memória é diferente.

Page 7: Libnuma - Afinidade de Memória e CPU

Afinidade e NUMA

● Problemas com NUMA:

○ Threads das aplicações veem a memória como um espaço de memória único.

○ Acesso excessivo de memória em diferentes domínios NUMA.

Page 8: Libnuma - Afinidade de Memória e CPU

Afinidade e NUMA

Em quais núcleos as threads ou processos estão rodando?

Onde a memória será alocada?

Page 9: Libnuma - Afinidade de Memória e CPU

Afinidade e NUMA

Afinidade:

Em quais núcleos as threads estão rodando?

Onde a memória será alocada?

Afinidade de CPU: Vincular um processo ou thread em um núcleo. Se o sistema operacional interromper a tarefa, ela não será migrada para outro núcleo e irá esperar até que o núcleo esteja livre novamente.

Page 10: Libnuma - Afinidade de Memória e CPU

Afinidade e NUMA

Afinidade:

Em quais núcleos as threads estão rodando?

Onde a memória será alocada?

Afinidade de CPU: Vincular um processo ou thread em um núcleo. Se o sistema operacional interromper a tarefa, ela não será migrada para outro núcleo e irá esperar até que o núcleo esteja livre novamente.

Afinidade de Memória: Alocação da memória o mais próximo possível do núcleo que está utilizando.

Page 11: Libnuma - Afinidade de Memória e CPU

Políticas NUMA

A API NUMA possui políticas que podem ser utilizadas para áreas da memória ou para CPUs.

Cada regra tem como objetivo realizar uma acão que permita utilizar algum modelo de alocacão ou associação de CPU em uma thread.

Page 12: Libnuma - Afinidade de Memória e CPU

Políticas NUMA

➔ Default◆ Alocar no nodo local.

➔ Bind◆ Alocar no conjunto de nodos.

➔ Interleave◆ Alocar de forma intercalada entre os nodos. (round-

robin)

➔ Preferred◆ Tentar alocar no nodo específico.

Page 13: Libnuma - Afinidade de Memória e CPU

numactl

Ferramenta onde podemos rodar processos utilizando as políticas NUMA.

Possibilidade de uso para programas que não podem ser alterados ou recompilados.

Instalação no Ubuntu:sudo apt-get install numactl

Page 14: Libnuma - Afinidade de Memória e CPU

numactl

Exemplo:

numactl --cpubind=0 --membind=0,1 nomeprograma

Page 15: Libnuma - Afinidade de Memória e CPU

numactl

Exemplo:

numactl --cpubind=0 --membind=0,1 nomeprograma

Chamada numactl

Executar na CPU 0 Somente

Alocar a memória na CPU 0

e 1 somente

Nome do programa que será

executado com as políticas

Page 16: Libnuma - Afinidade de Memória e CPU

Outras opções:

--preferred=<nodenum>

--interleave=nodemask

--membind=1

--localalloc

--hardware

numactl

Utilizar nodo específico preferêncialmente.Intercalar memória no conjunto de nodos (nodemask).

Aloca a memória no nodo da CPU 1.Aloca a memória somente no nodo local.Intercalar memória no conjunto de nodos (nodemask).

Page 17: Libnuma - Afinidade de Memória e CPU

numactl

A numaclt permite a aplicação das políticas para programas já compilados, de uma forma geral.

É pouco eficiente quando necessitamos otimizar partes da memória ou determinadas threads dentro de um programa.

Para isso, podemos usar a biblioteca libnuma.

Page 18: Libnuma - Afinidade de Memória e CPU

LibNUMA

Page 19: Libnuma - Afinidade de Memória e CPU

libnuma

É uma biblioteca que faz a ligacão entre os programas e as políticas NUMA. Possui uma interface de alto nível que tem como base as chamadas da API NUMA.

Projeto mantido pela Silicon Graphics International Corp.Autor = Andi Kleen, SUSE LabsVersion 1.0.3-rc1 mantida por Cliff Wickman and Christoph Lameter, SGI

Instalação no Ubuntu:sudo apt-get install libnuma1 libnuma-dev

Page 20: Libnuma - Afinidade de Memória e CPU

libnuma

#include <numa.h>

#include <stdio.h>

int main(){

if (numa_available() < 0) {

printf(‘‘Seu sistema não suporta a API NUMA\n’’);

}

}

Page 21: Libnuma - Afinidade de Memória e CPU

libnuma: Nodemasks

Nodemasks são conjuntos de nodos.

nodemask_t mask;

nodemask_zero(&mask); //inicializo zerado

nodemask_set(&mask,maxnode); //add nodo

if (nodemask_isset(&mask,1)){ //maior = 1

…}

nodemask_clr(&mask,maxnode); //remove nodo

Page 22: Libnuma - Afinidade de Memória e CPU

libnuma: Políticas

Com essas funções, todas as futuras alocações irão respeitar a política aplicada.

numa_set_preferred

numa_set_membind

numa_get_interleave_mask

numa_set_localalloc

Page 23: Libnuma - Afinidade de Memória e CPU

libnuma: Políticas

Exemplo:

numamask_t oldmask = numa_get_interleave_mask();

//salva a configuração atual de política

numa_set_interleave_mask(&numa_all_nodes);

//aplica política de memória intercalada

//usando modelo round robin

… //realiza a alocação intercalada

numa_set_interleave_mask(&oldmask);

//volta a configuração antiga

Page 24: Libnuma - Afinidade de Memória e CPU

libnuma: Vinculando CPUs

Funções para vincular threads em CPUs:

numa_run_on_node(1);

numa_set_prefered(1);

//Executar thread no node 1

nodemask_t mask;

nodemask_zero(&mask);

nodemask_set(&mask 1);

numa_bind(&mask);

//Também executa no node 1, mas usando numa_bind

Page 25: Libnuma - Afinidade de Memória e CPU

libnuma: Vinculando CPUs

Liberar a thread para executar em qualquer nodo.

numa_run_on_node_mask(&numa_all_nodes);

//numa_all_nodes é uma mask com todos os nodos //disponíveis.

Page 26: Libnuma - Afinidade de Memória e CPU

libnuma: Outras funções

numa_node_size

//retorna tamanho da memória do nodo.

numa_node_to_cpus

//retorna os números de todas as CPUs do nodo.

numa_exit_on_error

//finaliza o programa quando ocorrer algum erro.

Page 27: Libnuma - Afinidade de Memória e CPU

Código Exemplo

Programa recebe [N0] [N1] [N2]

Bind processo para N0Bind memória para N1Escrever na memória alocada na N1Imprimir tempoBind na memória para N2memcpy do N1 para N2Imprimir tempo

Page 28: Libnuma - Afinidade de Memória e CPU
Page 29: Libnuma - Afinidade de Memória e CPU
Page 30: Libnuma - Afinidade de Memória e CPU
Page 31: Libnuma - Afinidade de Memória e CPU
Page 32: Libnuma - Afinidade de Memória e CPU

Mai (Memory Affinity Interface)

Mai é uma interface de alto nível que disponibiliza funções para utilizar afinidade de memória em aplicações científicas executadas em arquiteturas ccNUMA.

Page 33: Libnuma - Afinidade de Memória e CPU

Mai (Memory Affinity Interface)● Simples de utilizar (menos

complexo que a API NUMA, numactl, etc) e controle de memória mais sofisticado (diversas políticas de memória baseadas em vetores),

● Portabilidade (abstração do Hardware)

● Desempenho (desempenho melhor que outras soluções tradicionais).

Page 34: Libnuma - Afinidade de Memória e CPU

Mai (Memory Affinity Interface)

Page 35: Libnuma - Afinidade de Memória e CPU

Mai (Memory Affinity Interface)

Page 36: Libnuma - Afinidade de Memória e CPU

Comparação Libnuma vs Mai

Item LibNUMA MaiComplexidade de

UtilizaçãoMédio Fácil

Alto Nível Sim Sim

CPU Affinity Sim Não

Memory Affinity Sim Sim

É necessário se preocupar com ponteiros e endereço de memória

Sim Não

Portabilidade Não Sim

Page 37: Libnuma - Afinidade de Memória e CPU

ConclusãoApresentamos aqui uma biblioteca que permite a utilização de técnicas para ganho de desempenho em arquiteturas NUMA. Podemos verificar que com ela, podemos utilizar as políticas em partes da alocação da memória em forma particular, tendo um nível de detalhamento muito maior. Também foi verificada uma outra opção de biblioteca chamada Mai, que fornece uma interface de alto nível para a aplicação das políticas, abstraindo algumas configurações necessárias quando utilizando libnuma ou numaclt.

Embora a biblioteca libnuma ofereça a opção de utilização das políticas de uma forma bastante dinâmica, a biblioteca Mai se mostrou mais fácil de utilizar e mais completa uma vez que oferece mecanismos mais sofisticados para o tratamento da afinidade de memória. No entanto, não apresenta opções para utilizar Afinidade de CPU, presente na libnuma.

Page 38: Libnuma - Afinidade de Memória e CPU

Referências

Page 39: Libnuma - Afinidade de Memória e CPU