MPI and stdin overheading?



我正在编写c++ MPI程序,但当传递一个大文件作为stdin时,我面临的问题是线程没有看到相同的stdin信息。

更详细地说,我正在传递一个输入文件列表作为标准输入,然后存储在vector<string>中:

MPI_Init(NULL,NULL);
int CORES, thread;
MPI_Comm_size(MPI_COMM_WORLD,&CORES);
MPI_Comm_rank(MPI_COMM_WORLD,&thread);
stringstream tline;
int count = 0;
for (std::string line; std::getline(std::cin, line);){
    tline << line << " ";
    count++;
    }
vector<string> args(count,"");
for(int i = 0; i < count; i++)
    tline >> args[i];
cout << thread << " " << count << endl; //each thread outputs the number of input files it received

我的问题是,这给不同的线程不同的数字。例如,在传递一个10000行文件后,我得到:

5 9464
6 9464
3 9464
4 9464
1 9554
2 9554
0 10000
7 9464

是因为一些开销吗?我怎样才能避免呢?

好的,所以基本上你的问题是,你所有的线程都从cin消费行,他们竞争。尽管cin通常为线程安全性提供了一些保证,但您并不总是确定将得到什么。检查这个线程:如何scanf(), std::cin在多线程环境下的行为?

解决方案:不使用CIN?使用一个文件,并让每个线程使用文件句柄单独打开文件。如果你真的想使用cin,那么让一个线程从MPI读取cin并广播给其他线程,然后他们可以用它做任何他们想要的。

最新更新