0

私の考えは、各ノードが毎回巨大なファイルの 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?

4

1 に答える 1

0

コメントを回答としてマークする機能のリクエストは引き続き拒否されるため、上記のソリューションをここにコピーします。

4kB ページを想定する代わりに、おそらく getpagesize() を呼び出す必要があります。いずれにせよ、1 キロバイトは 1000 バイトではなく 1024 バイトです。ファイル内の各 share*PAGE サイズのブロックの末尾にヌル バイトがありますか? そうでない場合、strlen は喜んで mmaped 領域と segfault の終わりを超えて実行されます。– グレッグ・イノゼムツェフ

于 2014-03-24T11:46:45.677 に答える