Pergunta

Preciso MPI_Gatherv() Um número de pares INT/String. Digamos que cada par se pareça com o seguinte:

struct Pair {
  int x;
  unsigned s_len;
  char s[1]; // variable-length string of s_len chars
};

Como definir um tipo de dados MPI apropriado para par?

Foi útil?

Solução

Em suma, é teoricamente impossível enviar uma mensagem de tamanho variável e recebê -la em um buffer do tamanho perfeito. Você precisará enviar uma primeira mensagem com os tamanhos de cada string e, em seguida, uma segunda mensagem com as strings, ou codificar esse meta na carga útil e usar um buffer de recebimento estático.

Se você precisar enviar apenas uma mensagem, eu renunciaria a definir um tipo de dados para o par: em vez disso, criaria um tipo de dados para toda a carga útil e despejava todos os dados em um pacote contíguo e sem topo. Então, na extremidade do recebimento, você pode itera sobre ela, alocando a quantidade exata de espaço necessária para cada corda e preenchendo -a. Deixe -me preparar um diagrama ASCII para ilustrar. Esta seria sua carga útil:

| ..x1 .. | ..s_len1 .. | .... string1 .... | ..x2 .. | ..s_len2 .. | .string2. | ....... String3 ....... | ...

Você envia tudo como uma unidade (por exemplo, uma matriz de mpi_byte), então o receptor descompactaria algo assim:

while (buffer is not empty)
{
    read x;
    read s_len;
    allocate s_len characters;
    move s_len characters from buffer to allocated space;
}

Observe, no entanto, que esta solução funciona apenas se a representação de dados de números inteiros e chars for a mesma nos sistemas de envio e recebimento.

Outras dicas

Eu não acho que você possa fazer exatamente o que deseja com o MPI. Eu sou um programador fortran, então tenha paciência comigo se minha compreensão de C é um pouco instável. Parece que você deseja passar uma estrutura de dados composta por 1 string INT e 1 (que você passa passando a localização do primeiro caractere na string) de um processo para outro? Eu acho que o que você terá que fazer é passar por uma corda de comprimento fixo - que teria, portanto, o tempo que qualquer uma das cordas que você realmente deseja passar. A área de recepção para a reunião dessas cordas terá que ser grande o suficiente para receber todas as cordas juntamente com seus comprimentos.

Você provavelmente vai querer declarar um novo tipo de dados MPI para suas estruturas; Você pode reuni -las e, como os dados coletados incluem o comprimento da string, recuperar as partes úteis da string no receptor.

Não tenho certeza disso, mas nunca me deparei com comprimentos de mensagens verdadeiramente variáveis, como você parece querer usar e ele parece parecido com ONM-MPI. Mas pode ser algo implementado na versão mais recente do MPI que eu nunca tropecei, apesar de olhar para a documentação on-line, não parece assim.

As implementações do MPI não inspecionam ou interpretam o conteúdo real de uma mensagem. Desde que você saiba o tamanho da estrutura de dados, você pode representar esse tamanho em algum número de char ou int. A implementação do MPI não saberá ou se preocupa com os detalhes internos reais dos dados.

Existem algumas advertências ... tanto o remetente quanto o receptor precisam concordar com a interpretação do conteúdo da mensagem e o buffer que você fornece no lado de envio e recebimento precisa se encaixar em algum número definível de char's ou int.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top