我想知道使用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如何处理并行文件读取操作。
答案 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会帮助你阅读流。