在OpenMP线程中降低性能

Max*_*nko 2 c++ performance file openmp

我使用Intel Xeon x2(24内核)和Windows Server 2008.
尝试并行化我的c ++程序.这里的模板代码:

vector< string > files;
vector< vector< float > > data; 
...
data.resize( files.size() ); 

#pragma omp parallel for 
for (int i=0; i<files.size(); i++) { // Files count is about 3000
    FILE *f = fopen(files[i].c_str(), "rb"); 

    // every file is about 40 mb
    data[i].resize(someSize);
    fread(&data[i][0], sizeof(float), someSize, f); 

    fclose(f);
    ...
    performCalculations();  
}
Run Code Online (Sandbox Code Playgroud)

CPU使用率仅为0到5%.
当我插入而不是fread(&data [i] [0],sizeof(float),someSize,f):

for (int j=0; j<data.size(); j++) {
    data[i][j] = rand(); 
}
Run Code Online (Sandbox Code Playgroud)

CPU使用率增加到100%.
我已经尝试过使用fstream和WinApi ReadFile,但它没有产生太大影响.

我究竟做错了什么?我不相信磁盘读数会这么慢......

Fre*_*Foo 6

我不相信磁盘读数会这么慢......

然后你最好开始相信.与CPU相比,磁盘速度极慢.并行I/O通常仅在您从多个源(如单独的磁盘或网络连接)读取时才有帮助.它可以很好地解决延迟问题,但不能解决带宽问题.

尝试一次性读取所有数据,然后连续读取,然后在并行循环中处理它.