私の考えは、各ノードが毎回巨大なファイルの 1 つのチャンクをマップして処理するというものです。次に、このチャンクをマンマップして、次のピースに進みます。
However, I always get failed on clusters (Openmpi) but run fine on my machine (mpich)
The mapping part is like this: PAGE is a integer = 4*1000*1000 // offset must be times number of one memory page, which is 4kb. ntask is the total number of nodes mytask represents the current node number so buffer size is set to total/number of nodes (statbuf.st_size/ntask)
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);
}
sm = mmap (0,(long long)statbuf.st_size/ntask, PROT_READ, MAP_SHARED | MAP_NORESERVE,src, mytask*share*PAGE);
if (MAP_FAILED == sm)
{
perror (" mmap source ");
exit (EXIT_FAILURE);
}
printf("length->%d\n",strlen(sm));
return sm;
}
error msg
[kalkyl3:15871] *** Process received signal ***
[kalkyl3:15871] Signal: Segmentation fault (11)
[kalkyl3:15871] Signal code: Address not mapped (1)
Can anyone give me some advice?