我有以下非MPI程序用于计算随机向量的平均值,每个并行进程生成不同的随机向量:
tran2.png
我使用g ++ 4.8编译程序,并使用
运行它#include <iostream>
#include <algorithm>
#include <vector>
int main(int argc, char* argv[]) {
clock_t begin = clock();
size_t N(10000000);
double avg(0.0);
int ID(atoi(argv[1]));
//Random seed for each process
srand(time(NULL) + ID);
std::vector<int> v1(N);
for(size_t n=0; n<N; n++) {
v1[n] = rand() % 100;
avg += v1[n]/double(N);
}
clock_t end = clock();
std::cout<<"Process "<<ID<<": Average = "<<avg<<std::endl;
std::cout<<"Process "<<ID<<": Time taken = "<<double(end - begin)/CLOCKS_PER_SEC<<" seconds"<<std::endl;
return 0;
}
对于单个进程(N = 1),即未并行化,我得到输出
mpirun -np N bash -c './test.exe $OMPI_COMM_WORLD_RANK'
而使用两个过程(N = 2),每个过程需要更长的时间:
Process 0: Average = 49.5008
Process 0: Time taken = 0.295664 seconds
与N = 2绑定到核心仍然使得其中一个进程与N = 1情况一样快,但另一个进程仍然很慢。我有一台4芯机器。
这里有一些竞争条件(我不明白为什么)?我错过了什么?