7

並列 I/O に関するいくつかのテストで、非常に奇妙な状況が発生しています。ここに状況があります..複数のスレッドが同じファイルへのファイルハンドラーを開き、ファイルの複数の場所 (等間隔) から有限数のバイトを読み取り、それを配列にダンプします。すべてブーストスレッドで行われます。ここで、ランダム アクセス シークのために遅くなるはずの HDD を想定しています。これが、私のテストが実際に SSD を対象としている理由です。HDDと比較して、ソリッドステートディスクから同じファイルを読み取る場合、ほとんど高速化されないことがわかりました。何が問題なのだろうか?それは私にとって非常に驚くべきことですか/私が正確に何をしているのかを確認するために、以下のコードも投稿しています:

    void readFunctor(std::string pathToFile, size_t filePos, BYTE* buffer, size_t buffPos, size_t dataLn, boost::barrier& barier) {

        FILE* pFile;
        pFile = fopen(pathToFile.c_str(), "rb");

        fseek(pFile, filePos, SEEK_SET);
        fread(buffer, sizeof(BYTE), dataLn, pFile);

        fclose(pFile);
        barier.wait();

    }

    void joinAllThreads(std::vector<boost::shared_ptr<boost::thread> > &threads) {

        for (std::vector<boost::shared_ptr<boost::thread> >::iterator it = threads.begin(); it != threads.end(); ++it) {
            (*it).get()->join();

        }

    }

    void readDataInParallel(BYTE* buffer, std::string pathToFile, size_t lenOfData, size_t numThreads) {
        std::vector<boost::shared_ptr<boost::thread> > threads;
        boost::barrier barier(numThreads);
        size_t dataPerThread = lenOfData / numThreads;

        for (int var = 0; var < numThreads; ++var) {
            size_t filePos = var * dataPerThread;
            size_t bufferPos = var * dataPerThread;
            size_t dataLenForCurrentThread = dataPerThread;
            if (var == numThreads - 1) {
                dataLenForCurrentThread = dataLenForCurrentThread + (lenOfData % numThreads);
            }

            boost::shared_ptr<boost::thread> thread(
                    new boost::thread(readFunctor, pathToFile, filePos, buffer, bufferPos, dataLenForCurrentThread, boost::ref(barier)));
            threads.push_back(thread);

        }

        joinAllThreads(threads);

    }

今..私のメインファイルに私はほとんど持っています..:

    int start_s = clock();
    size_t sizeOfData = 2032221073;
    boost::shared_ptr<BYTE> buffer((BYTE*) malloc(sizeOfData));
    readDataInParallel(buffer.get(), "/home/zahari/Desktop/kernels_big.dat", sizeOfData, 4);
    clock_t stop_s = clock();
    printf("%f %f\n", ((double) start_s / (CLOCKS_PER_SEC)) * 1000, (stop_s / double(CLOCKS_PER_SEC)) * 1000);

驚いたことに、SSD からの読み取りでは、HDD と比べて速度が向上しませんか? それはなぜでしょうか?

4

4 に答える 4

7

ファイルはおそらくキャッシュされるため、測定しているのは CPU オーバーヘッドであり、I/O ではありません。ディスクキャッシュ全体をフラッシュする代わりにposix_fadvise()、ファイルを読み取る前に「wontneed」フラグを使用してファイルを呼び出し、カーネルにキャッシュしないように通知できます。つまり、ある種の *nix プラットフォームまたは Mac OS を使用していると仮定します。

于 2013-11-21T15:06:43.113 に答える
6

これに対する考えられる説明は、SATA III セットアップで実行していないことです。使用している SATA III 6gb/s SSD ドライブは、マザーボード上の古い SATA II 3gb/s コントローラーに接続されています。その場合、SSD は 3 GB/秒に抑制されます。

ハードウェア構成を確認してください。SATA II の場合、モボを交換して、SSD が最大限のパフォーマンスの可能性を発揮できるようにする必要があります。

HDD ディスク ドライブもチェックして、SATA、SATA II、または SATA III であるかどうかを確認します。

ハードウェア インターフェイス レベルで同じものを比較していることを確認してください。

于 2015-09-22T09:05:07.790 に答える
2

SSDまたはHDDのデータサイズに応じて、OSはファイルをキャッシュします。したがって、実際にはディスクにアクセスしているのではなく、メモリにアクセスしている可能性があります。

于 2013-07-16T12:47:16.977 に答える