Memória compartilhada dinâmica
Defina o tamanho da memória compartilhada no momento da execução.
Memória compartilhada dinâmica é uma aula grátis de CUDA Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de CUDA Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de CUDA Academy inclui 4 aulas no total.
Quando o tamanho ainda não é conhecido
Às vezes, o tamanho da matriz compartilhada depende de um valor obtido durante a execução, portanto você não pode defini-lo no código. O CUDA resolve isso com memória compartilhada dinâmica.
A declaração extern
Você a declara com extern __shared__ e colchetes vazios. Nenhum tamanho é colocado no código, então o compilador o deixa em aberto.
extern __shared__ float sdata[];Tamanho definido no lançamento
Você passa a quantidade de bytes como o terceiro parâmetro do lançamento, entre a quantidade de threads e os colchetes de fechamento. Isso define o tamanho durante a execução.
kern<<<blocks, threads, n * sizeof(float)>>>();Ela está sempre em bytes
Um erro clássico: esse terceiro argumento é o tamanho em bytes, não em elementos. Sempre multiplique a quantidade por sizeof para obter o valor correto.
O padrão é zero bytes
Se você omitir o terceiro argumento, o CUDA reservará zero bytes de memória compartilhada dinâmica. Ler sdata nesse caso é comportamento indefinido; portanto, nunca se esqueça dele.
Estática e dinâmica juntas
Você pode usar os dois tipos em um único kernel. As matrizes estáticas mantêm tamanhos fixos, enquanto o bloco dinâmico se adapta ao argumento do lançamento.
Um buffer, várias matrizes
A memória compartilhada dinâmica fornece um único buffer linear. Para armazenar várias matrizes, você mesmo o divide usando deslocamentos de ponteiros. 🔪
Dividindo com deslocamentos
Aponte uma segunda matriz para uma posição intermediária do buffer. Apenas tenha cuidado para alinhar cada parte, de modo que um float nunca comece no meio de uma palavra.
extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];Por que usar a memória dinâmica
Ela permite que um único kernel compilado atenda a muitos tamanhos de blocos. Você ajusta o tamanho compartilhado a cada lançamento sem recompilar para cada caso.
Observe o limite do hardware
Ainda assim, você não pode exceder o máximo por bloco. Solicite bytes demais no lançamento, e o kernel simplesmente não será iniciado.
Optando por alocações maiores
Para ultrapassar o limite padrão em GPUs mais recentes, você precisa optar por isso com cudaFuncSetAttribute antes do lançamento. Caso contrário, solicitações grandes serão rejeitadas.
Verificação rápida
Vamos verificar como o tamanho da memória compartilhada dinâmica é definido.
Recapitulação
Você aprendeu que as matrizes extern __shared__ recebem seu tamanho em bytes no lançamento, podem ser divididas em várias matrizes e respeitam o limite por bloco. Curso concluído! 🎉
Perguntas Frequentes
A aula “Memória compartilhada dinâmica” é grátis?
Sim — o texto completo de “Memória compartilhada dinâmica” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de CUDA Academy, atualize para CoddyKit PRO. O curso de CUDA Academy inclui 4 aulas no total.
O que vou aprender em “Memória compartilhada dinâmica”?
Defina o tamanho da memória compartilhada no momento da execução. Você pratica CUDA Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar CUDA Academy?
Nenhuma experiência prévia é necessária. CUDA Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Memória compartilhada dinâmica”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de CUDA Academy?
Sim. Cada aula de CUDA Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Declare vetores __shared__
- Sincronize com __syncthreads
- Evite conflitos de bancos
- Memória compartilhada dinâmica