从特定处理器广播最小值
Broadcast minimum value from a specific processor
我有 4 个处理器 (p0、p1、p2、p3),每个处理器都有一个值数组:
int i;
srand(time(NULL))
float *d= malloc(5, sizeof(float));
for(i=0;i<5;i++){
d[i] = (float) rand();
}
我的目标是每个处理器在本地找到其数组的最小元素 p_min
,因此在所有处理器中我们选择最小的一个,即 min(p0_min, p1_min, p2_min, p3_min)
,并将其发送到所有处理器。我使用以下步骤:
- 每个处理器将其本地最小值发送到根(此处为
p0
)。
- 根在所有元素中找到全局个最小元素
- 因此,具有全局最小元素的处理器应该将其广播给其他人。
我的问题是:在这种情况下,根 p0 如何通知具有全局最小值的节点广播其值?我用的是下面的方式,但是我确定它是否合理!
if(p_id == 0){
for ( i = 1; i < P; ++i) {
MPI_Recv(min[i], 1, MPI_FLOAT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
p_id = find_min(min, 4);
}else{
MPI_Send(&min, 1, MPI_INT,0, 0, MPI_COMM_WORLD);
}
MPI_Bcast(&p_min, 1, MPI_FLOAT, p_id, MPI_COMM_WORLD);
您的建议不有效。 MPI_Bcast
的根必须在所有等级上都相同,而 p_id
则不是。此外,我对您使用不同的变量和 find_min
.
感到非常困惑
有集体作业一步到位,MPI_Allreduce
:
MPI_Allreduce(MPI_IN_PLACE, &min, 1, MPI_FLOAT, MPI_MIN, MPI_COMM_WORLD);
此调用后,min
在所有等级上都相同,是调用前 min
的所有值中的最小值。
注:MPI_IN_PLACE
是读写同一个缓冲区的特殊指标
我有 4 个处理器 (p0、p1、p2、p3),每个处理器都有一个值数组:
int i;
srand(time(NULL))
float *d= malloc(5, sizeof(float));
for(i=0;i<5;i++){
d[i] = (float) rand();
}
我的目标是每个处理器在本地找到其数组的最小元素 p_min
,因此在所有处理器中我们选择最小的一个,即 min(p0_min, p1_min, p2_min, p3_min)
,并将其发送到所有处理器。我使用以下步骤:
- 每个处理器将其本地最小值发送到根(此处为
p0
)。 - 根在所有元素中找到全局个最小元素
- 因此,具有全局最小元素的处理器应该将其广播给其他人。
我的问题是:在这种情况下,根 p0 如何通知具有全局最小值的节点广播其值?我用的是下面的方式,但是我确定它是否合理!
if(p_id == 0){
for ( i = 1; i < P; ++i) {
MPI_Recv(min[i], 1, MPI_FLOAT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
p_id = find_min(min, 4);
}else{
MPI_Send(&min, 1, MPI_INT,0, 0, MPI_COMM_WORLD);
}
MPI_Bcast(&p_min, 1, MPI_FLOAT, p_id, MPI_COMM_WORLD);
您的建议不有效。 MPI_Bcast
的根必须在所有等级上都相同,而 p_id
则不是。此外,我对您使用不同的变量和 find_min
.
有集体作业一步到位,MPI_Allreduce
:
MPI_Allreduce(MPI_IN_PLACE, &min, 1, MPI_FLOAT, MPI_MIN, MPI_COMM_WORLD);
此调用后,min
在所有等级上都相同,是调用前 min
的所有值中的最小值。
注:MPI_IN_PLACE
是读写同一个缓冲区的特殊指标