
Os modelos baseados em agentes prosperam no paralelismo. A GPU FLAME executa funções de agente como kernels CUDA, para que uma GPU de classe de estação de trabalho possa ser semelhante milhões de agentes em tempo real — se você estruturar o modelo de forma limpa. Este guia mostra um caminho prático e compatível com a GPU NetLogo/Mesa para a GPU FLAME.
Nota de precisão: a maioria dos ABMs funciona bem no FP32. Se seu modelo for sensível, veja o Lista de verificação do FP64.
Seu trabalho funciona dentro de um contêiner. Duas opções que funcionam bem:
A) Tempo de execução CUDA+compilação a partir da fonte (portátil)
# Dockerfile (esboço)
DE nvidia/cuda: 12.4.1 - tempo de execução - ubuntu22.04
ARG DEBIAN_FRONTEND=Não interativo
EXECUTE apt-get update && apt-get install -y --no-install-recommends\
cmake essencial para construção git python3 python3-pip\
&& rm -rf /var/lib/apt/lists/ *
ENV NVIDIA_VISIBLE_DEVICES=Todos\
nvidia_driver_capabilities=Computação, utilitário
B) Use uma imagem da GPU FLAME mantida (mais rápida)
De qualquer forma, confirme a visibilidade da GPU dentro do contêiner:
nvidia-smi
/work
─ CMakeLists.txt
─ src/
│ ─ agents.cu # funções do agente
│ ─ ─ model.cu # descrição e camadas do modelo
│ ─ main.cu # ponto de entrada
─ driver python/ # Python opcional
─ dados/ # entradas, sementes, pontos de verificação
Inicialize o CMake e crie fora da árvore:
cmake -S. -B build -DCMAKE_BUILD_TYPE=Lançamento
cmake --build build -j
A GPU FLAME funciona funções do agente sobre matrizes de agentes na GPU. Use mensagens para interações locais.
//agents.cu
#include <flamegpu/flamegpu.h>
//Cada agente lê mensagens em sua vizinhança e atualiza a velocidade
FLAMEGPU_AGENT_FUNCTION (etapa, flamegpu: :messageSpatial2D, flamegpu: :messageSpatial2D) {
<float>const float x = FlameGPU->getVariable (“x”);
<float>const float y = FlameGPU->getVariable (“y”);
<float>float vx = FlameGPU->getVariable (“vx”);
<float>float vy = FlameGPU->getVariable (“vy”);
//coesão simples
flutuar cx = 0.f, cy = 0.f; int n = 0;
for (const auto &m: FlameGPU->message_in (x, y)) {//iteração espacial
cx += m.GetVariable <float>(“x”);
cy += m.getVariable <float>(“y”);
n++;
}
se (n) {cx /= n; cy /= n; vx += 0,05f * (cx - x); vy += 0,05f * (cy - y);}
//escreve o estado e a posição de saída
FlameGPU -> definir variável <float>(“vx”, vx);
FlameGPU -> definir variável <float>(“vy”, vy);
FlameGPU -> definir variável <float>(“x”, x+ vx);
FlameGPU-> definir variável <float>(“y”, y+ vy);
//emite mensagem para os vizinhos na próxima etapa
<float>FlameGPU-> message_out.setVariável (“x”, x);
<float>FlameGPU->message_out.setVariável (“y”, y);
retornar flamegpu: :ALIVE;
}
Descrição do modelo (padrão)
//model.cu
#include <flamegpu/flamegpu.h>
usando o namespace flamegpu;
modelo de descrição do modelo (“abm”);
agente AgentDescription = Model.newAgent (“A”);
<float>Agent.newVariable <float>(“x”); Agent.newVariable (“y”);
<float>agent.newVariable <float>(“vx”); agent.newVariable (“vy”);
messageSpatial2D: :Descrição msg (modelo);
msg.setBounds (0, 100, 0, 100); //limites de domínio
msg.setRadius (1.0f); //raio de interação
msg.Nova variável <float>(“x”);
msg.Nova variável <float>(“y”);
camada LayerDescription = model.newLayer (“L”);
layer.addAgentFunction (etapa);
Isso reflete os padrões comuns do NetLogo (tartarugas + raio de visão), mas em um layout de estrutura de matrizes compatível com GPU.
. /build/abm --agents 5_000_000 --steps 1000 --seed 42\
--dados de saída/pontos de verificação --intervalo de ponto de verificação 100
Se os resultados divergirem, verifique o raio da mensagem, as condições de limite e a ordem de atualização.
Use números importantes para o planejamento.
métricas:
agentes: <N>
etapas: <T>
segundos_parede: < ... >
agent_passos_por_segundo: N*t/wall_seconds
custo_per_million_agent_steps: (preço_por_hora * parede_segundos/3600) /1e6 * (N*T)
Registre o modelo de GPU/VRAM, driver, CUDA, versão da GPU FLAME e a linha de comando exata.
GPU ociosa
Poucos agentes ou trabalho pesado do lado do anfitrião. Aumente N, reduza para E/S por etapa ou transfira a configuração para o código do dispositivo.
Fora da memória
Limite as variáveis do agente, fragmente as saídas ou escolha um perfil de VRAM maior.
Resultados não determinísticos
Corrija as sementes e evite reduções não ordenadas do lado do hospedeiro. Documento RNG.
Erros de compilação
Combine CUDA com sua imagem base e cadeia de ferramentas CMake. Limpe e reconstrua.
hardware:
gpu: "<model>(<VRAM>GB)”
motorista: “<NVIDIA driver>”
<CUDA version>cuda: “”
software:
<version>flamegpu: “”
imagem: “Ubuntu 24.04 LTS (CUDA 12.6)”
modelo:
domínio: “[0,100] x [0,100]”
agentes: <N>
regras: “demonstração somente de coesão”
executar:
cmd:”. <N><T>/build/abm --agents --steps --seed 42"
pontos de verificação: “a cada 100 etapas”
saídas:
wall_seconds: “<... >”
agent_steps_per_second: “<... >”
cust_per_million_agent_steps: “<... >”
Inicie uma instância de GPU com um modelo pronto para CUDA (por exemplo, Ubuntu 24.04 LTS/CUDA 12.6) ou sua própria imagem GROMACS. Aproveite o faturamento flexível por segundo com modelos personalizados e a capacidade de iniciar, interromper e retomar suas sessões a qualquer momento. Não tem certeza sobre os requisitos do FP64? Entre em contato com o suporte para ajudar a selecionar o perfil de hardware ideal para suas necessidades computacionais.