【发布时间】:2020-10-31 01:01:33
【问题描述】:
所以,我有一个问题,我有一个数组,我必须在我的数组中找到大于索引数 k 的数字的计数。所以我实施了一个 master-worker 策略,我有一个 master 负责 I/O 并将工作分配给 worker。在主线程中,我以类似矩阵的形状创建了数组,因此我可以轻松地将子数组传递给工作人员(我知道这听起来很奇怪)。然后在主线程中,我从输入读取所有值到我的子数组,并将comp(比较值)设置为k索引值的值。
然后我将工作部分大小、比较值和工作数据传递给所有线程(包括获得其工作份额的主线程)。最后,每个工人完成自己的工作并将结果报告给主人,主人在接收工人的数据时会将他们的值添加到自己的值中,然后在屏幕上打印总结果。
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <math.h>
int main(int argc, char *args[]){
int rank, psize;
MPI_Status status;
MPI_Init(&argc, &args);
MPI_Comm_size(MPI_COMM_WORLD, &psize);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int *workvet, worksize, comp;
if(rank == 0){
int tam, k;
int **subvets, portion;
scanf("%d", &tam);
scanf("%d", &k);
portion = ceil((float)tam/(float)psize);
subvets = malloc(sizeof(int) * psize);
for(int i = 0; i < psize; i++)
subvets[i] = calloc(portion, sizeof(int));
for(int i = 0; i < psize; i++){
for(int j = 0; j < portion; j++){
if((i*j+j) < tam)
scanf("%d ", &subvets[i][j]);
if((i*j+j) == k)
comp = subvets[i][j];
}
}
for(int i = 1; i < psize; i++){
MPI_Send(&portion, 1, MPI_INT, i, i, MPI_COMM_WORLD);
MPI_Send(&comp, 1, MPI_INT, i, i, MPI_COMM_WORLD);
MPI_Send(subvets[i], portion, MPI_INT, i, i, MPI_COMM_WORLD);
}
workvet = calloc(portion, sizeof(int));
workvet = subvets[0];
worksize = portion;
} else {
MPI_Recv(&worksize, 1, MPI_INT, 0, rank, MPI_COMM_WORLD, &status);
MPI_Recv(&comp, 1, MPI_INT, 0, rank, MPI_COMM_WORLD, &status);
workvet = calloc(worksize, sizeof(int));
MPI_Recv(workvet, worksize, MPI_INT, 0, rank, MPI_COMM_WORLD, &status);
}
int maior = 0;
for(int i = 0; i < worksize; i++){
if(workvet[i] > comp)
maior++;
}
if(rank == 0){
int temp;
for(int i = 1; i < psize; i++){
MPI_Recv(&temp, 1, MPI_INT, i, rank, MPI_COMM_WORLD, &status);
maior += temp;
}
printf("%d números maiores que %d", maior, comp);
} else {
MPI_Send(&maior, 1, MPI_INT, 0, rank, MPI_COMM_WORLD);
}
MPI_Finalize();
}
我的问题是它看起来像是卡在一个循环中,并且在尝试调试时,我在主 for 中放置了一个 printf,它在子数组中进行比较并进行无限打印,但是,当我将相同的打印放在代码中的其他任何地方,它不会被打印。我不知道我在哪里失败了,也不知道如何调试我的代码。
输入数据:
10 // size
7 // k
1 2 3 4 5 6 7 8 9 10 // elements
所以,我的程序应该计算有多少元素大于索引 7 的元素,它对应于值 8,在这种情况下应该返回 2。
【问题讨论】:
-
对于初学者来说,
tam被使用未初始化 [来自-Wall],所以portion不会完全符合您的预期(即随机)。 -
感谢@CraigEstey 的提醒,我在代码的那部分搞砸了,但仍然没有按预期工作=/。这个
-Wall有什么作用? -
与您上一个问题中的错误相同。计数是元素,而不是字节。
-
-Wall是您提供给编译器以启用 all [嗯,大多数] 警告的选项。添加-Wextra[更多警告] 和-Werror[告诉编译器将警告视为错误]。您应该始终使用这些。他们可以在运行时节省 吨 的调试。