我正在使用MPICH编写并行C程序。该程序自然有一个顺序部分和一个并行部分。并行部分似乎工作正常,但是我遇到顺序部分的问题。
在顺序部分中,程序从文件中读取一些值,然后继续在其他进程中分发它们。它写成如下:
if (rank == 0)
{
gettimeofday(&sequentialStartTime, NULL);
// Read document id's and their weights into the corresponding variables
documentCount = readDocuments(&weights, &documentIds, documentsFileName, dictionarySize);
readQuery(&query, queryFileName, dictionarySize);
gettimeofday(&endTime, NULL);
timersub(&endTime, &sequentialStartTime, &resultTime);
printf("Sequential part: %.2f ms\n", (double) resultTime.tv_sec + resultTime.tv_usec / 1000.0);
//distribute the data to other processes
} else {
//wait for the data and the start working
}
此处,readQuery
和readDocuments
正在读取文件中的值,并在完成后打印已用时间。这段代码实际上工作得很好。当我尝试使用不同数量的处理器运行时会出现问题。
我使用以下命令运行程序
mpirun -np p ./main
其中p是处理器计数。无论我使用多少个处理器,我都希望顺序部分能在一定的时间内运行。对于p值1到4,这是成立的,但是当我使用5到8作为p值时,顺序部分需要更多时间。
我使用的处理器是英特尔®酷睿™i7-4790 CPU @ 3.60GHz×8,我的操作系统是Windows 8.1 64位。我在Ubuntu 14.04上运行这个程序,它运行在一台虚拟机上,可以完全访问我的处理器和8 GB的RAM。
我想到的唯一原因是,当进程计数高于4时,主进程可能会共享其运行的物理核心与另一个进程,因为我知道这个CPU有4个物理核心但功能好像它有8个,使用超线程技术。但是,当我将p从5增加到6到7等等时,执行时间会线性增加,因此情况并非如此。
对此有任何帮助或想法将受到高度赞赏。提前谢谢。
编辑:我意识到增加p会增加运行时间,无论价值如何。随着p的增加,我的时间会线性增加。