Я пытаюсь прочитать файл 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секунд.
Может кто-нибудь сказать мне, где проблема?