並列 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 と比べて速度が向上しませんか? それはなぜでしょうか?