1

IO 負荷の高いコードでプリフェッチ ヒントを使用しようとしています。gpfs_fcntl() のマニュアル ページの理解に従ってコードをセットアップしましたが、EINVAL が発生します。私は今、私が間違っていることを少し迷っています - どんなヒントでも大歓迎です。

マウント:/dev/scratch16 on /bgscratch type gpfs (rw,dev=cadmos-gss.gss1a:scratch16,ldev=scratch16)

Error: Prefetch using gpfs_fcntl failed: Invalid argument (22), 32768b at 7713095680 from /bgscratch/foo.dat

ファイル:-rw-rw-r-- 1 delalond bbp 14739308544 Jul 25 2012 /bgscratch/foo.dat

ソース:

void BufferedFile::prefetch( const uint64_t offset, const uint64_t size )
{
   if( file_.fd == -1 )
       file_.fd = ::open( filename.c_str(), O_RDONLY );
   if( file_.fd == -1 )
   {
       LBWARN << "open() failed: " << lunchbox::sysError << std::endl;
       return;
   }
   struct
   {
       gpfsFcntlHeader_t hdr;
       gpfsAccessRange_t acc;
   } arg;
   arg.hdr.totalLength = sizeof(arg);
   arg.hdr.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
   arg.hdr.fcntlReserved = 0;
   arg.acc.structLen = sizeof(arg.acc);
   arg.acc.structType = GPFS_ACCESS_RANGE;
   arg.acc.start = offset;
   arg.acc.length = size;
   arg.acc.isWrite = 0;
   if( gpfs_fcntl( file_.fd, &arg ) != 0 )
        LBWARN << "Prefetch using gpfs_fcntl failed: " << lunchbox::sysError
               << ", " << size << "b at " << offset << " from " << filename
               << std::endl;
}

編集: スタンドアロン アプリケーションで問題を再現できました。長い長い 64 ビット システムであっても、4 GB を超えるとエラーが発生します。

4

3 に答える 3

0

気が付かずにはいられませんでした/bgscratch: Blue Gene /Q システムを使用している場合、V1R2M1 以降を実行していない限り、gpfs_fcntl() は機能しません。古いバージョンのドライバーは、gpfs_fcntl システム コールを i/o ノードにリレーしません。

于 2014-01-27T17:18:20.753 に答える
0

ファイルの終わりの後に読み取ろうとしています。

を考えると、次のfileSizeようなものを試してください

arg.acc.length = fileSize > offset + size ? size : fileSize - offset;
于 2013-05-02T09:44:11.897 に答える
0

あなたoffsetsizeuint64_t、符号なし整数です。構造体のドキュメントにgpfsAccessRange_tは要素がstartあり、符号付き整数である可能性があります。がどのように定義されているか知っていますか?lengthoffset_toffset_t

HDF5の使用にも注意してくださいoff_t

于 2013-05-02T18:38:40.860 に答える