Не удалось получить ускорение при использовании OpenMP при чтении файлов - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь прочитать файл 500M в C ++, используя OpenMP.Я делю файл на несколько блоков и загружаю «убитую» запись каждый раз параллельно, повторяю.

Я работаю над Ubuntu, используя gcc для компиляции файла (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 и не связано с num_threads, который я установил в предложении #pragma. Время чтения такое же, около 200секунд.

Может кто-нибудь сказать мне, где проблема?

1 Ответ

0 голосов
/ 16 октября 2018

Вы правы, добавляя #pragma omp critical перед операциями ввода / вывода!

Однако

Критическая директива omp определяет раздел кода, который должен выполняться одним потоком ввремя.

Большая часть вашего кода внутри цикла находится в критической секции omp.И остальная часть вашего кода не потребляет ЦП.

Поэтому то, что вы наблюдаете, нормально.

Вы вряд ли получите улучшенную производительность при операциях ввода-вывода с использованием OpenMP, если вы не используете параллельную файловую систему.
OpenMP действительно помогает улучшить интенсивную загрузку процессора.

...