У меня возникла очень странная ситуация с некоторыми из моих тестов, касающихся параллельного ввода-вывода. Вот ситуация. У меня есть несколько потоков, открывающих обработчик файлов для одного и того же файла и считывающих из нескольких мест файла (с равными интервалами) конечное количество байтов и выгружающих их в массив. Все делается с помощью потоков boost. Теперь я предполагаю, что с жестким диском это должно быть медленнее из-за поиска произвольного доступа. Вот почему мои тесты на самом деле нацелены на SSD. Оказывается, я почти не получаю никакого ускорения при чтении одного и того же файла с твердотельного диска по сравнению с жестким диском. Интересно, в чем может быть проблема? Это кажется очень удивительным только мне? Я также публикую свой код ниже, чтобы увидеть, что я именно делаю:
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? Почему это может быть?