2016-12-06 3 views
1
if(my_rank==0) 
    { 
     sprintf(str,"<?xml version=\"1.0\" ?>\n"); 
     MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request); 
     a=a+strlen(str); 
     sprintf(str,"<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []> \n"); 
     MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request); 
     a=a+strlen(str); 
     sprintf(str,"<Xdmf Version=\"2.0\">\n"); 
     MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request); 
     a=a+strlen(str); 
    } 

erreur aio_write(): argument non valide; J'ai aussi une commande d'attente avant de fermer le fichier. Cette erreur se produit lors de l'utilisation sur le cluster avec openmpi/2.0.1 sur la machine locale avec openmpi/1.10.1 il fonctionne très bienMpi_File_iwrite ne parvient pas à écrire; Erreur aio_write(): argument non valide

+0

la réponse 1 est terminée, le problème a été résolu, – BatiCode

Répondre

0

MPI_File_iwrite() est une opération sans blocage. Par conséquent, il peut revenir juste après avoir été appelé et lire le contenu de str siècles après son retour. Voici quelques conséquences:

  • Modification du tampon str droite après avoir appelé MPI_File_iwrite() est pas une bonne idée. En effet, l'achèvement de l'opération d'écriture doit être vérifié avant de modifier le tampon str!
  • Les appels successifs à MPI_File_iwrite() peuvent conduire à des fichiers brouillées: l'ordre des opérations d'écriture ne peut pas être similaire à l'ordre des appels ...
  • Écrasement la demande chaque fois MPI_File_iwrite(...,&request) est appelé est un bon moyen de faire en sorte que la l'achèvement de toutes les opérations d'écriture ne sera jamais vérifié ...

Deux solutions:

  • stick to MPI_File_write() ou appelez MPI_Wait(&request,MPI_STATUS_IGNORE); juste après chaque appel à MPI_File_iwrite(). De cette façon, l'ordre de l'opération d'écriture sera identique à celui des appels.
  • Si l'ordre des lignes n'a pas d'importance, le code suivant pourrait faire l'affaire:

    if(my_rank==0) 
    { 
        char str[142]; 
        char str2[142]; 
        char str3[142]; 
        MPI_Request requests[3]; 
        snprintf(str,142,"<?xml version=\"1.0\" ?>\n"); 
        MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request[0]); 
        a=a+strlen(str); 
        snprintf(str2,142,"<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []> \n"); 
        MPI_File_iwrite(fp,str2,strlen(str2), MPI_CHAR,&request[1]); 
        a=a+strlen(str2); 
        snprintf(str3,142,"<Xdmf Version=\"2.0\">\n"); 
        MPI_File_iwrite(fp,str3,strlen(str3), MPI_CHAR,&request[2]); 
        a=a+strlen(str3); 
        MPI_Waitall(3,requests,MPI_STATUSES_IGNORE); 
    } 
    

Enfin, la documentation de l'Open MPI sur MPI_File_iwrite() et MPI_File_write() stipule que:

It is erroneous to call this function if MPI_MODE_SEQUENTIAL mode was specified when the file was opened.

+0

Je suis déjà passé à MPI_File_write; – BatiCode