标签:cout use index start open ring careful hello 并行处理
任务说明:有36篇文档,现在要读入,并统计词频,字典长度25,希望能够比较串并行读写操作的时间差距。
// LoadDocsInUbuntu.cpp
//
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
char filename[100];
size_t d;
FILE *fileptr;
int word;
vector< vector<int> > corpus;
printf("load data ...\n");
for (d = 1; d < 37; d++){
sprintf(filename, "..//data/doc_%d.txt", d);
fileptr = fopen(filename, "r");
vector<int> doc;
int ff[25] = { 0 };
while (fscanf(fileptr, "%d", &word) != EOF)
{
ff[word - 1] = ff[word - 1] + 1;
doc.push_back(word);
}
corpus.push_back(doc);
fclose(fileptr);
sprintf(filename, "..//result/freqUbuntuSerial_%d.txt", d);
fileptr = fopen(filename, "w");
for (int f = 0; f < 25; f++)
{
fprintf(fileptr, "%d ", ff[f]);
}
fclose(fileptr);
}
cout <<"corpus.size()="<< corpus.size() << endl;
return 0;
}
针对第一种思路,使用openmp做多线程处理:
// LoadDocsByOpenMP.cpp
//
#include <omp.h>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;
int main()
{
char filename[100],resultname[100];
int d;
FILE *fileptr[360];
int word;
int ff[360][25] = { 0 };
//vector< vector<int> > corpus;
clock_t start,finish;
int f[360]={0};
start=clock();
printf("load data ...\n");
#pragma omp parallel for num_threads(4)
for (d = 1; d < 361; d++){
printf("Hello world, I am %d, docs index %d.\n",omp_get_thread_num(),d);
sprintf(filename, "..//data/doc_%d.txt", d);
fileptr[d-1] = fopen(filename, "r");
//int ff[25]={0};
////vector<int> doc;
while (fscanf(fileptr[d-1], "%d", &word) != EOF)
{
ff[d-1][word - 1] = ff[d-1][word - 1] + 1;
//ff[word-1]=ff[word-1]+1;
// //doc.push_back(word);
}
////corpus.push_back(doc);
fclose(fileptr[d-1]);
sprintf(resultname, "..//result/freqByOpenMP_%d.txt", d);//Be CAREFUL!For the name "filename" has been used before, we must name the string differently here.
fileptr[d-1] = fopen(resultname, "w");
for (f[d-1] = 0; f[d-1] < 25; f[d-1]++)
{
fprintf(fileptr[d-1], "%d ", ff[f[d-1]]);
}
fclose(fileptr[d-1]);
}
//cout <<"corpus.size()="<< corpus.size() << endl;
finish=clock();
cout<<"time cost : "<< (double)(finish-start)/ CLOCKS_PER_SEC<<endl;
return 0;
}
但初步比较openmp对串行读取的速度并没有太多提升,反而是当进程数多于系统物理核数的时候,程序时间会加长。
另外两种实现思路在后续学习中继续实现。
标签:cout use index start open ring careful hello 并行处理
原文地址:http://www.cnblogs.com/simayuhe/p/7208393.html