#include <math.h>
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*-------------------------------------*/
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/time.h>
#include<sys/mman.h>
#include<sys/types.h>
#include <mpi.h>
#define PERMS 0600
#define PAGE 4096
int ntask=0, mytask=0;
void
write_result (char *detail)
{
int fd;
char *filename = (char *) malloc (1000*sizeof(char));
sprintf(filename, "%d", mytask);
strcat(filename,".fa");
fd = open (filename, O_CREAT | O_RDWR, S_IRWXU);
write (fd, detail, strlen (detail));
close (fd);
}
char *
mmaping (char *source)
{
int src;
char *sm;
struct stat statbuf;
if ((src = open (source, O_RDONLY)) < 0)
{
perror (" open source ");
exit (EXIT_FAILURE);
}
if (fstat (src, &statbuf) < 0)
{
perror (" fstat source ");
exit (EXIT_FAILURE);
}
printf("task->%d\n",mytask);
printf("total task->%d\n",ntask);
int piece = statbuf.st_size/PAGE;
int share = piece/ntask;
printf("share->%d\n",share);
sm = mmap (0,statbuf.st_size/ntask, PROT_READ, MAP_SHARED | MAP_NORESERVE,src, mytask*share*PAGE);
printf("%lld\n",(long long int) statbuf.st_size);
if (MAP_FAILED == sm)
{
perror (" mmap source ");
exit (EXIT_FAILURE);
}
return sm;
}
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ntask);
MPI_Comm_rank(MPI_COMM_WORLD, &mytask);
char *x = mmaping(argv[1]);
printf("%d\n",strlen(x));
write_result(x);
MPI_Finalize();
return 0;
}
各スレッドは、ファイルの一部を読み取り、それを書き留めます。
ローカル マシン (mpich) で完全に正常に動作します。クラスター (openmpi) でエラーが発生しました。
関数 write_result の close(fd) でプログラムが終了しました。
ここにエラーメッセージがあります
[kalkyl3:30022] *** Process received signal ***
[kalkyl3:30022] Signal: Segmentation fault (11)
[kalkyl3:30022] Signal code: Address not mapped (1)
[kalkyl3:30022] Failing at address: 0x2b9d952d7000
[kalkyl3:30022] [ 0] /lib64/libpthread.so.0() [0x371900f4a0]
[kalkyl3:30022] [ 1] /lib64/libc.so.6() [0x371892fcef]
[kalkyl3:30022] [ 2] ./a.out(write_result+0x58) [0x400df8]
[kalkyl3:30022] [ 3] ./a.out(main+0x4c) [0x400e6c]
[kalkyl3:30022] [ 4] /lib64/libc.so.6(__libc_start_main+0xfd) [0x371881ecdd]
[kalkyl3:30022] [ 5] ./a.out() [0x400ba9]
[kalkyl3:30022] *** End of error message ***
関連する問題を検索した後、問題はファイルの開閉プロセスに起因する可能性があると推測しています。特定のスレッドによって開かれたファイルは、同じスレッドによって閉じられる必要があります。おそらくopenmpiは、どのスレッドがそれを開き、どのスレッドが閉じたかを認識していません。しかし、MPICH では問題なく動作します。