读取文件时无法使用OpenMP加速

时间:2018-10-14 04:17:02

标签: c++ multithreading openmp readfile

我尝试使用OpenMP在C ++中读取500M文件。我将文件分成几个块,并每次并行加载“ killed”记录,重复。

我正在使用gcc编译ubuntu(g ++ mytest.cpp -o mytest -fopenmp)。

这里提供了代码:

(我已经删除了一些代码,以使ReadFile功能更加突出。)

map<unsigned int, int> Node2Num;
typedef struct {
    unsigned int num;
    set<unsigned int>adj;
}node; 
node Gnode[4800000];

void ReadFile()
{
    ifstream input("./soc-LiveJournal1.bin", ios::in | ios::binary);
    cout << "start to read the file..." << endl;

    //to get the size of the file
    input.seekg(0, ios_base::end);
    size_t fileSize = input.tellg();
    input.seekg(0, ios_base::beg);

    //to split the file into ReadTime blocks
    int EdgesInFile = fileSize / 8; 
    int ReadTime = EdgesInFile / PerEdges;
    unsigned int buffer[2*PerEdges];

    int tid, i, j, killed;
    unsigned int src, des;
    volatile int cnt = 0; //all the nodes stored in the file

    #pragma omp parallel for num_threads(16) private(i,buffer,killed,j,src,des,kk,tid) firstprivate(ReadTime,EdgesInFile)
    for(i = 0;i < ReadTime+1;i++){
        #pragma omp critical
        {
            input.read((char*)buffer, sizeof(buffer));
            cout<<"Thread Num:"<<omp_get_thread_num()<<" Read Time:"<<i<<endl;
        }
        killed = PerEdges;
        if(i == ReadTime) 
            killed = EdgesInFile - ReadTime*PerEdges; 
        for(j = 0;j < killed;j++) {
            src = (unsigned int)buffer[j];
            des = (unsigned int)buffer[j+1];
            #pragma omp critical
            {
            //to store the src and des... 
            }
        }
    }
    cout << "finish the reading!" << endl;
    input.close();
}

int main()
{
    clock_t T1 = clock();
    ReadFile(); 
    clock_t T2 = clock();
    cout<< "Reading Time:" << (double)(T2 - T1) / CLOCKS_PER_SEC << "seconds" << endl;
    return 0;
}

我在代码中读取的文件存储一个图形,由连续的线组成,每行(8字节)包括两个连续的节点-源节点(4字节)和目标节点(4字节)。节点号存储为unsigned int类型

但是通过添加#pragma子句无法获得任何加速。读取时间与OpenMP无关,也与我在#pragma子句中设置的num_threads没有关系。读取时间是同样,大约200秒。

谁能告诉我问题出在哪里?

1 个答案:

答案 0 :(得分:0)

您正在I / O操作前添加#pragma omp critical

但是

  

omp关键指令标识必须是   一次由一个线程执行。

循环中的大多数代码都位于omp关键部分。而且其余的代码也不占用CPU。

因此,您观察到的是正常的。

除非使用并行文件系统,否则使用OpenMP几乎不会提高I / O操作的性能。
OpenMP确实可以改善CPU占用率。