是否有可能通过使用openMP在fstream(文件读取)上获得一些性能提升

时间:2012-02-16 05:56:04

标签: c++ openmp fstream

我想知道使用openMP读取文件是否有可能获得一些性能提升。

示例代码,

fstream file;

file.open("test.txt",ios::in);

file.seekg(0,ios::end);

int len = file.tellg();

char *arr = new char[len];

char *temp = new char[1];

int i;

#pragma omp parallel for shared(arr, len) private(temp, i)
for(i = 0; i < len; i++)
{
    file.seekg(i);
    file.read(temp,1);
    arr[i] = temp[0];
}

我想使用多个线程进行I / O操作是一个糟糕的选择,因为最终文件读取操作将被序列化。但是,我想是否可以期待性能提升。此外,我还想知道openMP如何处理并行文件读取操作。

2 个答案:

答案 0 :(得分:7)

正如您所提到的,您不可能获得任何加速并行化任何类型的I / O绑定任务。但是,还有一个更大的问题。代码甚至都不正确。

seekg()read()方法会修改file变量。所以你的迭代不是独立的。所以你将在流上有竞争条件。换句话说,循环不可并行化。

所以不要指望代码可以工作 - 更不用说具有更好的性能了。

答案 1 :(得分:3)

尽管文件流中有许多性能改进,但您提议的不在其中:

  • std::streambuf是有状态的,并试图从多个执行线程中同时访问它将彻底弄乱它。
  • 处理单个字符本质上是当代处理器的最坏情况。如果你真的最终并行完成,你会有多个处理器搞乱相同的缓存行。与单个执行线程相比,这实际上会显着降低性能。
  • 我不知道为什么人们如此喜欢使用搜索:每次搜索基本上都会杀死任何当前缓冲区,并且可能导致系统调用只是将流定位到已定义的状态。寻求的关键问题是将流设置为读取或写入,具体取决于下一步操作。是的,可以考虑开放模式,但可能不是。

如果您想阅读使用std::ifstream阅读文件的快速方法,那么

  • imbue()宣传不进行任何转化的std::locale
  • std::binary模式
  • 打开文件
  • 跳过试图得到对文件大小的错误估计(寻求到最后并希望以某种方式为您提供文件中的字符数是徒劳的)
  • 阅读合适的std::ostream例如std::ostringstream(如果可以提供目标缓冲区,则可以使用更快的输出流),使用流缓冲区的输出运算符:out << in.rdbuf()

    我没有看到concurreny会帮助你阅读流。