Coarray Fortran - Coarray Fortran

Coarray Fortran
Paradigma multi-paradigma : paralelo , a passagem de mensagens , imperativo ( processual , orientada a objectos ), estruturado
Projetado por Robert Numrich e John Reid
Desenvolvedor Comissão Fortran PL22.3
Versão estável
Fortran 2008 (ISO / IEC 1539-1: 2010)
disciplina Typing forte , estática
OS Multi-plataforma
grandes implementações
Cray, G95 , gfortran , Fortran Intel compilador , arroz (CAF 2,0) , OpenUH
Influenciado por
Fortran

Coarray Fortran ( CAF ), anteriormente conhecido como F-- , começou como uma extensão do Fortran 95/2003 para processamento paralelo criado por Robert Numrich e John Reid na década de 1990. O Fortran 2008 padrão (ISO / IEC 1539-1: 2010) agora inclui coarrays (escrito sem hífen), tal como decidido na reunião do Comitê Fortran a ISO Maio de 2005; a sintaxe no padrão 2008 Fortran é um pouco diferente da proposta original CAF.

A CAF programa é interpretado como se fosse replicado várias vezes e todas as cópias foram executados de forma assíncrona. Cada cópia tem seu próprio conjunto de objetos de dados e é denominada uma imagem . A matriz sintaxe de Fortran é estendido com índices de arrasto adicionais em parêntesis rectos para fornecer uma representação concisa de referências aos dados que são distribuídos por imagens.

A extensão CAF foi implementado em alguns Fortran compiladores como os da Cray (desde a versão 3.1). Desde a inclusão de coarrays no padrão 2008 Fortran, o número de implementações está crescendo. O primeiro open-source compilador que implementou coarrays conforme especificado no padrão 2008 Fortran para arquiteturas Linux é G95 . Atualmente, gfortran fornece ampla cobertura de recursos coarray do Fortran em configuração de imagem única ou múltipla (o último baseado na biblioteca OpenCoarrays). Outra implementação de coarrays e extensões paralelas relacionados de Fortran 2008 está disponível no compilador OpenUH (um ramo da Open64 ) desenvolvido na Universidade de Houston .

Implementação em compiladores

CAF é muitas vezes implementado em cima de um Message Passing Interface biblioteca (MPI) para a portabilidade. Algumas implementações, tais como os disponíveis nos gfortran compiladores e OpenUH, podem correr por cima das outras camadas de baixo nível (por exemplo, GasNet) concebidos para suportar o espaço de endereço global de particionados idiomas.

Exemplos

Um exemplo simples é dada abaixo. CAF é usado em CGPACK, um pacote de código aberto para simular materiais policristalinos desenvolvidas na Universidade de Bristol .

program Hello_World
  implicit none
  integer :: i  ! Local variable
  character(len=20) :: name[*] ! scalar coarray, one "name" for each image.
  ! Note: "name" is the local variable while "name[<index>]" accesses the
  ! variable in a specific image; "name[this_image()]" is the same as "name".

  ! Interact with the user on Image 1; execution for all others pass by.
  if (this_image() == 1) then   
    write(*,'(a)',advance='no') 'Enter your name: '
    read(*,'(a)') name

    ! Distribute information to other images
    do i = 2, num_images()
      name[i] = name
    end do
  end if

  sync all ! Barrier to make sure the data have arrived.

  ! I/O from all images, executing in any order, but each record written is intact. 
  write(*,'(3a,i0)') 'Hello ',trim(name),' from image ', this_image()
end program Hello_world

O programa acima escalas mal porque o loop que distribui informações executa sequencialmente. Escrever programas escaláveis ​​muitas vezes requer uma compreensão sofisticada de algoritmos paralelos, um conhecimento detalhado das características de rede subjacentes, e afinação especial para as características de aplicação, tais como o tamanho das transferências de dados. Para a maioria dos desenvolvedores de aplicativos, permitindo que o compilador ou biblioteca de tempo de execução decidir o melhor algoritmo de prova mais robusta e de alto desempenho. Fortran 2018 vai oferecer sub-rotinas de comunicação coletivos que capacitam compilador e da biblioteca de tempo de execução equipes para encapsular algoritmos paralelos eficientes para comunicação coletiva e computação distribuída em um conjunto de sub-rotinas coletivas. Essas sub-rotinas e outros recursos de programação paralelas novos são resumidos em uma especificação técnica que o comitê de padrões Fortran votou para incorporar em Fortran 2018. Estes permitem ao usuário escrever uma versão mais eficiente do algoritmo acima

program Hello_World
  implicit none
  character(len=20) :: name[*] ! scalar coarray, one "name" for each image.
  ! Note: "name" is the local variable while "name[<index>]" accesses the
  ! variable in a specific image; "name[this_image()]" is the same as "name".

  ! Interact with the user on Image 1; execution for all others pass by.
  if (this_image() == 1) then   
    write(*,'(a)',advance='no') 'Enter your name: '
    read(*,'(a)') name
  end if
  ! Distribute information to all images
  call co_broadcast(name,source_image=1)

  ! I/O from all images, executing in any order, but each record written is intact. 
  write(*,'(3a,i0)') 'Hello ',trim(name),' from image ', this_image()
end program Hello_world

onde a falta de sincronização explícita oferece o potencial para um maior desempenho devido a uma menor coordenação entre as imagens. Além disso, TS 18508 garante que "A transferência de uma imagem não pode ocorrer antes de a sub-rotina coletiva foi invocado sobre essa imagem." Isto implica alguma sincronização parcial dentro co_broadcast, mas pode ser maior desempenho do que o "sincronizar todo" no exemplo anterior. TS 18508 também incorpora vários outros novos recursos que tratam de questões visadas pela 2.0 esforço CAF descrito abaixo. Exemplos incluem equipes de imagens e eventos.

Uma perspectiva alternativa

Em 2011, a Universidade Rice seguiu uma visão alternativa de extensões coarray para a linguagem Fortran. Sua perspectiva é que as escolhas de design do comitê padrão do Fortran 2008, foram moldadas mais pelo desejo de apresentar como algumas modificações para o idioma quanto possível do que para montar o melhor conjunto de extensões para apoiar a programação paralela . Na sua opinião, tanto o projeto original de Numrich e Reid e as extensões coarray propostas para Fortran 2008 sofrem com as seguintes deficiências:

  • Não há suporte para processadores subconjuntos; por exemplo, coarrays devem ser repartidas por todas as imagens.
  • As extensões coarray têm qualquer noção de ponteiros globais, que são essenciais para criar e manipular qualquer tipo de estrutura de dados ligados.
  • Dependência de seções críticas nomeados para exclusão mútua impede paralelismo escalável associando exclusão mútua com as regiões de código em vez de objetos de dados.
  • declaração imagens sincronização Fortran 2008 é não fornece um espaço de sincronização segura. Como resultado, as operações de sincronização no código do usuário que estão pendentes quando uma chamada de biblioteca é feita pode interferir na sincronização na chamada biblioteca.
  • Não existem mecanismos para evitar ou tolerar latência ao manipular dados sobre imagens remotas.
  • Não há suporte para a comunicação coletiva.

Para resolver estes problemas, o grupo Rice University está desenvolvendo um redesign-ardósia limpa do modelo de programação Coarray Fortran. O novo design do arroz para Coarray Fortran, que eles chamam Coarray Fortran 2.0, é um conjunto expressivo de extensões baseadas em coarray para Fortran projetado para fornecer um modelo de programação paralela produtivo. Comparado com Fortran 2008, novas extensões de linguagem baseada coarray de Rice incluem alguns recursos adicionais:

  • subconjuntos processo conhecido como equipes, que suportam coarrays, comunicação coletiva e indexação relativa de processar imagens para operações de pares,
  • topologias, que aumentam as equipes com uma estrutura de comunicação lógica,
  • dinâmica de alocação / desalocação de coarrays e outros dados compartilhados,
  • alocação coarray equipe de base e desalocação,
  • ponteiros globais de apoio às estruturas de dados dinâmicos,
  • apoio para esconder a latência e evitar, e
    • cópias assíncronos,
    • operações coletivas assíncronos, e
    • transporte função.
  • suporte aprimorado para sincronização para o controle de grão fino sobre a execução do programa.
    • apoio seguro e escalável para a exclusão mútua, incluindo bloqueios e conjuntos de bloqueio,
    • eventos, que proporcionam um espaço seguro para sincronização ponto-a-ponto,
    • cofence, o que obriga a conclusão local das operações assíncronas,
    • acabamento, um SPMD barreira-como construir que as forças conclusão de operações assíncronas através de uma equipe,

Veja também

Referências

Geral