Perspectiva histórica
É realmente impossível dizer como serão os novos paradigmas no futuro, por exemplo, uma boa perspectiva histórica que sugiro ler Rise and Fall of HPF, de Ken Kennedy . Kennedy dá conta de dois padrões emergentes, MPI versus um compilador inteligente, e detalha como o MPI teve a quantidade certa de adotantes iniciais e flexibilidade para dominar. O HPF finalmente resolveu seus problemas, mas já era tarde demais.
De várias maneiras, vários paradigmas, como PGAS e OpenMP, seguem a mesma tendência do HPF. Os códigos anteriores não eram flexíveis o suficiente para usar bem e deixaram muito desempenho em cima da mesa. Mas a promessa de não ter que escrever todos os pontos do algoritmo paralelo é um objetivo atraente. Portanto, a busca de novos modelos está sempre sendo buscada.
Tendências claras em hardware
Agora, o sucesso da MPI tem sido frequentemente citado por estar intimamente ligado à forma como modela o hardware em que é executado. Aproximadamente cada nó tem um número pequeno de processos e a transmissão das mensagens para ponto a ponto local ou através de operações coletivas coordenadas é facilmente realizada no espaço em cluster. Por causa disso, não confio em ninguém que dê um paradigma que não segue de perto as novas tendências de hardware. Na verdade, fiquei convencido dessa opinião pelo trabalho de Vivak Sarakar .
De acordo com isso, aqui estão três tendências que estão claramente avançando em novas arquiteturas. E deixe-me ser claro, agora existem doze arquiteturas diferentes sendo comercializadas no HPC. Isso ocorre há menos de 5 anos, apresentando apenas o x86, portanto, nos próximos dias haverá muitas oportunidades para o uso de hardware de maneiras diferentes e interessantes
- Fichas para fins especiais: pense em grandes unidades vetoriais como aceleradores (visão adotada por Bill Dally, da Nvidia)
- Chips de baixa potência: Clusters baseados em ARM (para acomodar orçamentos de energia)
- Lado a lado de chips: pense em lado a lado de chips com especificações diferentes (trabalho de Avant Argwal )
Modelos Atuais
O modelo atual é na verdade 3 níveis de profundidade. Embora existam muitos códigos usando bem dois desses níveis, poucos surgiram usando os três. Acredito que, para chegar à exascala, é preciso investir na determinação de se o código pode ser executado nos três níveis. Este é provavelmente o caminho mais seguro para interagir bem com as tendências atuais.
Deixe-me iterar nos modelos e como eles precisarão mudar com base nas novas visualizações de hardware previstas.
Distribuído
Os players no nível distribuído se enquadram amplamente nas línguas MPI e PGAS. O MPI é um vencedor claro no momento, mas idiomas do PGAS, como UPC e Chapel, estão avançando no espaço. Uma boa indicação é o HPC Benchmark Challenge. Os idiomas do PGAS estão dando implementações muito elegantes dos benchmarks.
O ponto mais interessante aqui é que, embora atualmente este modelo funcione apenas no nível do nó, ele será um modelo importante dentro de um nó para arquiteturas de mosaico. Uma indicação é o chip Intel SCC, que agia fundamentalmente como um sistema distribuído. A equipe do SCC criou sua própria implementação MPI e muitas equipes tiveram êxito em portar bibliotecas da comunidade para essa arquitetura.
Mas, para ser sincero, o PGAS realmente tem uma boa história para entrar nesse espaço. Deseja realmente programar o internode MPI e depois fazer o mesmo truque intranode? Um grande problema com essas arquiteturas lado a lado é que elas terão velocidades de clock diferentes nos chips e grandes diferenças na largura de banda da memória, de modo que os códigos de desempenho devem levar isso em consideração.
Memória compartilhada no nó
Aqui vemos o MPI frequentemente sendo "bom o suficiente", mas PThreads (e bibliotecas derivadas de PThreads como Intel Parallel Building Blocks) e OpenMP ainda são usados com frequência. A visão comum é que haverá um momento em que haverá threads de memória compartilhada suficientes que o modelo de soquete da MPI quebrará para o RPC ou você precisará de um processo de menor peso executando no núcleo. Já é possível ver as indicações de sistemas IBM Bluegene com problemas com o MPI de memória compartilhada.
Como comenta Matt, o maior aumento de desempenho para códigos intensivos em computação é a vetorização do código serial. Enquanto muitas pessoas assumem que isso é verdade em aceleradores, também é crítico para máquinas no nó também. Acredito que Westmere tenha uma FPU de 4 largos, portanto, só é possível obter um quarto dos flops sem vetorização.
Embora eu não veja o OpenMP atual entrando bem nesse espaço, há um lugar para chips de baixa potência ou de ladrilhos usarem mais fios leves. O OpenMP tem dificuldade em descrever como o fluxo de dados funciona e, à medida que mais threads são usados, apenas vejo essa tendência se tornar mais exagerada; basta ver exemplos do que é preciso fazer para obter uma pré-busca adequada com o OpenMP.
Tanto o OpenMP quanto o PThreads em um nível suficiente do curso podem tirar proveito da vetorização necessária para obter uma boa porcentagem de pico, mas isso exige a quebra de seus algoritmos de uma maneira que a vetorização seja natural.
Coprocessador
Finalmente, o surgimento do coprocessador (GPU, MIC, acclerators Cell) ocorreu. Está ficando claro que nenhum caminho para a exascale será completo sem eles. No SC11, todos os participantes do prêmio Bell os usavam com muita eficiência para chegar aos petaflops baixos. Enquanto CUDA e OpenCL dominaram o mercado atual, tenho esperanças de que os compiladores OpenACC e PGAS entrem no espaço.
Agora, para chegar à exascala, uma proposta é acoplar os chips de baixa potência a muitos co-processadores. Isso eliminará muito bem a camada intermediária da pilha atual e usará códigos que gerenciam problemas de decisão no chip principal e embaralham o trabalho para os co-processadores. Isso significa que, para que o código funcione com bastante eficiência, uma pessoa deve repensar os algoritmos em termos de kernels (ou codelets), ou seja, fragmentos paralelos no nível da instrução sem ramificação. Até onde eu sei, uma solução para essa evolução é bastante aberta.
Como isso afeta o desenvolvedor do aplicativo
Agora, para chegar à sua pergunta. Se você deseja se proteger das complexidades que se aproximam das máquinas de escala exascória, faça algumas coisas:
- Desenvolva seus algoritmos para ajustar pelo menos três níveis de hierarquia paralela.
- Crie seus algoritmos em termos de kernels que podem ser movidos entre a hierarquia.
- Relaxe sua necessidade de qualquer processo seqüencial, todos esses efeitos ocorrerão de forma assíncrona, porque a execução síncrona simplesmente não é possível.
Se você quer se apresentar hoje, o MPI + CUDA / OpenCL é bom o suficiente, mas o UPC está chegando lá, portanto, não é uma má idéia levar alguns dias e aprendê-lo. O OpenMP inicia, mas gera problemas quando o código precisa ser refatorado. PThreads requer reescrever completamente seu código para seu estilo. O que torna o MPI + CUDA / OpenCL o melhor modelo atual.
O que não é discutido aqui
Embora toda essa conversa sobre exascale seja agradável, algo que não é realmente discutido aqui é obter dados dentro e fora das máquinas. Embora tenha havido muitos avanços nos sistemas de memória, não os vemos no cluster de mercadorias (muito caro demais). Agora que a computação intensiva de dados está se tornando um grande foco de todas as conferências de supercomputação, é provável que haja um movimento maior no espaço de alta largura de banda da memória.
Isso leva a outra tendência que pode acontecer (se as agências de financiamento certas se envolverem). As máquinas se tornarão cada vez mais especializadas para o tipo de computação necessário. Já vemos máquinas "com muitos dados" sendo financiadas pela NSF, mas essas máquinas estão em uma trilha diferente da do Exascale Grand Challenge de 2019.
Isso se tornou mais do que o esperado, solicite referências onde você precisar deles nos comentários