Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MPI:当处理器数量增加时,输出时间增加_C++_Performance_Output_Mpi_Execution Time - Fatal编程技术网

C++ MPI:当处理器数量增加时,输出时间增加

C++ MPI:当处理器数量增加时,输出时间增加,c++,performance,output,mpi,execution-time,C++,Performance,Output,Mpi,Execution Time,我在c++/mpi程序中打印稀疏矩阵时遇到问题,希望您能帮助我解决 问题:我需要在一个与MPI并行的程序中,以.txt文件的形式打印一个稀疏矩阵,作为3-ples(x,y,v_xy)的列表。由于我是MPI新手,我决定不处理库提供的并行IO指令,而是让主处理器(在我的例子中是0)打印输出。但是,当我增加处理器数量时,打印矩阵的时间会增加: 1处理器:11.7秒 2个处理器:26.4秒 4个处理器:25.4秒 我已经验证了这三种情况下的输出完全相同。以下是守则的相关章节: if (rank ==

我在c++/mpi程序中打印稀疏矩阵时遇到问题,希望您能帮助我解决

问题:我需要在一个与MPI并行的程序中,以.txt文件的形式打印一个稀疏矩阵,作为3-ples(x,y,v_xy)的列表。由于我是MPI新手,我决定不处理库提供的并行IO指令,而是让主处理器(在我的例子中是0)打印输出。但是,当我增加处理器数量时,打印矩阵的时间会增加:

  • 1处理器:11.7秒
  • 2个处理器:26.4秒
  • 4个处理器:25.4秒
我已经验证了这三种情况下的输出完全相同。以下是守则的相关章节:

if (rank == 0)
{    
    sw.start();

    std::ofstream ofs_output(output_file);
    targets.print(ofs_output);
    ofs_output.close();

    sw.stop();
    time_output = sw.get_duration();
    std::cout << time_output << std::endl;
}

我不明白是什么导致了速度减慢,因为只有处理器0进行输出,这是程序的最后一次操作:所有其他处理器都在处理器0打印输出时完成。你知道吗?

嗯,我终于明白了问题的原因。在linux虚拟机上运行我的程序(在MPI上并行),当使用的内核数量增加时,在.txt文件中打印大量数据的时间大大增加。该问题是由虚拟机引起的,该虚拟机在使用MPI时行为不正确。我在一台8核的物理机器上测试了相同的程序,打印输出的时间不会随着使用的核数的增加而增加

这实际上是三台不同的机器,还是你假装一台机器上有三个处理器来测试代码?@stefan:我使用的是i7四核处理器(dell XPS 15)。我忘了提到我正在Oracle linux virtualbox上执行代码,我在设置中为它分配了4个处理器。我无法计算打印执行时间wrt与处理器数量的关系,因为只有处理器0执行打印指令。在虚拟机上,切换到多个处理器将产生开销,从而降低系统速度。因此,您的测量经验条件不相关!顺便说一句,gettimeofday()并不是衡量性能的最佳函数(请参见标题“Notes”下的内容)。@Christophe:谢谢您提供的有用参考。我会记住的。关于速度减慢,是否只有当我使用
mpirun-np k
k>=2
执行代码时才会出现开销?在这种情况下,您认为向VM分配更多RAM会提高输出性能吗?我目前在虚拟机上使用4Gb,而我的笔记本电脑上只有16Gb可用。谢谢你的帮助是的,这种减速看起来很糟糕。当您使用更多内核时,每个内核都会稍微慢一点,但处理器的总体吞吐量会更高。虚拟处理器的问题在于,每个环境不仅仅是一个运行在内核上的线程。您是否尝试过在没有WM的情况下运行MPI?通常,MPI应该能够在不增加开销的情况下利用本机内核。请看这里:
void sparse_matrix::print(std::ofstream &ofs)
{
    int temp_row;
    for (const_iterator iter_row = _matrix.begin(); iter_row != _matrix.end(); ++iter_row)
    {
        temp_row = (*iter_row).get_key();
        for (value_type::const_iterator iter_col = (*iter_row).get_value().begin();
        iter_col != (*iter_row).get_value().end(); ++iter_col)
        {
            ofs << temp_row << "," << (*iter_col).get_key() << "," << (*iter_col).get_value() << std::endl;
        }
    }
}