【发布时间】:2015-08-11 07:52:15
【问题描述】:
我正在编写测试数字是否为素数的程序。一开始我会计算分配给每个进程的数量,然后将这个数量发送给进程。接下来,执行计算并将数据发送回保存结果的进程 0。下面的代码有效,但是当我增加进程数量时,我的程序不会加速。在我看来,我的程序不能并行工作。怎么了?这是我在 MPI 的第一个程序,欢迎任何建议。
我使用 mpich2 在 Intel Core i7-950 上测试我的程序。
main.cpp:
if (rank == 0) {
int workers = (size-1);
readFromFile(path);
int elements_per_proc = (N + (workers-1)) / workers;
int rest = N % elements_per_proc;
for (int i=1; i <= workers; i++) {
if((i == workers) && (rest != 0))
MPI_Send(&rest, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
else
MPI_Send(&elements_per_proc, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
int it = 1;
for (int i=0; i < N; i++) {
if((i != 0) && ((i % elements_per_proc) == 0))
it++;
MPI_Isend(&input[i], 1, MPI_INT, it, 0, MPI_COMM_WORLD, &send_request);
}
}
if (rank != 0) {
int count;
MPI_Recv(&count, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for (int j=0; j < count; j++) {
MPI_Recv(&number, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
result = test(number, k);
send_array[0] = number;
send_array[1] = result;
MPI_Send(send_array, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
}
if (rank == 0) {
for (int i=0; i < N; i++) {
MPI_Recv(rec_array, 2, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// save results
}
}
【问题讨论】:
-
您的主要测试算法是顺序的吗?
-
@Dieter Lücking,我使用 Miller-Rabin 素数测试。每个进程测试部分数字,这些操作是独立的。
标签: c++ performance mpi