Zah*_*ari 5 c c++ io parallel-processing solid-state-drive
关于并行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);
}
Run Code Online (Sandbox Code Playgroud)
现在..在我的主文件中,我几乎有..:
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);
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,当从SSD读取数据时,与HDD相比,我没有得到任何提速吗?为什么会这样呢?
您的文件可能已被缓存,因此您要测量的是CPU开销而不是I / O。除了刷新整个磁盘缓存之外,您还可以posix_fadvise()在读取文件之前调用该文件,并使用“ wontneed”标志来告知内核不要缓存该文件。也就是说,假设您使用的是某种* nix平台或Mac OS。
对此的可能解释是,您未在SATA III设置下运行。您使用的SATA III 6gb / s SSD驱动器已连接至主板上较旧的SATA II 3gb / s控制器。在这种情况下,您的SSD会降低到3 gb / s。
检查您的硬件配置。如果是SATA II,则需要更换主板,以使SSD发挥其全部性能潜力。
还要检查您的HDD磁盘驱动器,看看它是SATA,SATA II还是SATA III。
确保您在硬件接口级别比较一个苹果与另一个苹果。
您的测量主要是设置四个线程的所有样板,每个线程执行一次读取,然后在四个线程中的最后一个执行barier.wait().
为了测量性能,每个线程应在终止前在循环中进行数千次单字节读取。
以下是我的更改建议:
void readFunctor(std::string pathToFile, size_t filePos, BYTE* buffer, size_t buffPos, size_t dataLn)
{
FILE* pFile;
pFile = fopen(pathToFile.c_str(), "rb");
fseek(pFile, filePos, SEEK_SET);
// initialize random number generation
std::random_device rd;
tr1::uniform_int_distribution<> randomizer(0, dataLn-1);
for (int i=0; i<dataLn; i++)
{
fseek(pFile, filePos+randomizer(rd), SEEK_SET);
fread(buffer++, sizeof(BYTE), 1, pFile);
}
fclose(pFile);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5071 次 |
| 最近记录: |