- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我正在处理的排序找到所有处理器的全局最小值和最大值。我正在尝试使用 MPI_Reduceall
int rank, nproc;
MPI_Comm_size(MPI_COMM_WORLD,&nproc);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
vector< vector<double> > buckets(nproc);
double local_min = *std::min_element(values_to_sort.begin(), values_to_sort.end());
double local_max = *std::max_element(values_to_sort.begin(), values_to_sort.end());
int min = 0;
int max = 0;
double global_min;
double global_max;
MPI_Allreduce(&local_min, &global_min, 1, MPI_2DOUBLE_PRECISION, MPI_MINLOC, MPI_COMM_WORLD);
MPI_Allreduce(&local_max, &global_max, 1, MPI_2DOUBLE_PRECISION, MPI_MAXLOC, MPI_COMM_WORLD);
cout << "local_min " << local_min << " local_max " << local_max << endl;
cout << "global_min " << global_min << " global_max " << global_max << endl;
显示了我的代码,但每次都出现段错误。这是一个简单的函数,使用以下方法生成的随机 double 调用:
int min = 0;
int max = 100;
vector<double> values_to_sort;
vector<double> sorted_values;
for(int i=0; i< 1000; i++)
{
values_to_sort.push_back( ((double) rand()*(max-min)/(double)RAND_MAX-min) );
}
如果有人知道为什么这个段错误,请告诉我。我真的很想以一种快速简单的方式获得全局最大值和最小值。
最佳答案
你真的需要在这里使用MPI_MINLOC
和MPI_MAXLOC
吗?因为您陈述问题的方式和使用解决方案的方式,MPI_MIN
和 MPI_MAX
就可以了:
double local_min = *std::min_element(values_to_sort.begin(), values_to_sort.end());
double local_max = *std::max_element(values_to_sort.begin(), values_to_sort.end());
double global_min;
double global_max;
MPI_Allreduce(&local_min, &global_min, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
MPI_Allreduce(&local_max, &global_max, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
cout << "local_min " << local_min << " local_max " << local_max << endl;
cout << "global_min " << global_min << " global_max " << global_max << endl;
现在,如果您真的需要拥有全局最小值和全局最大值的进程的等级,那么您确实需要 MPI_MINLOC
和 MPI_MAXLOC
。但是,您应该像这样使用它:
struct double_int {
double val;
int rank;
} local_min, local_max, global_min, global_max;
local_min.val = *std::min_element(values_to_sort.begin(), values_to_sort.end());
local_max.val = *std::max_element(values_to_sort.begin(), values_to_sort.end());
local_min.rank = local_max.rank = rank;
MPI_Allreduce(&local_min, &global_min, 1, MPI_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
MPI_Allreduce(&local_max, &global_max, 1, MPI_DOUBLE_INT, MPI_MAXLOC, MPI_COMM_WORLD);
cout << "on process " << rank << " local_min " << local_min.val
<< " local_max " << local_max.val << endl;
cout << "global_min " << global_min.val << " owned by process " << global_min.rank << endl;
cout << "global_max " << global_max.val << " owned by process " << global_max.rank << endl;
关于c++ - MPI_Allreduce 加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226232/
我正在编写涉及 for 循环的代码,该循环在每个索引处进行计算。 这些计算中的最小值存储在一个变量中,我在程序末尾使用 MPI_Allreduce 来确定所有进程的全局最小值。 但是,我需要一种方法来
我正在尝试为我正在处理的排序找到所有处理器的全局最小值和最大值。我正在尝试使用 MPI_Reduceall int rank, nproc; MPI_Comm_size(MPI_COMM_WORLD,
我在每个处理器上都有一个列表 range 和数字。我想确定这些列表 range 中每一行的最大数量。 前四个列出了每个处理器 P0-P3 的 range。红色列表包含 MPI_Allreduce 之后
我在 C 中有一个结构的动态数组。说: int n=100; struct particle{ double pos[3]; double force[3]; double ma
考虑这样的事情: typedef struct TS { double a,b,c; } S; ... S x,y; ... MPI_Allreduce(&x, &y, 3, MPI_DOUB
我最近在 MPI 工作。我对 MPI 还很陌生。但最近我在使用MPICH2时发现一个问题。这是我从 Hello world 程序修改而来的小 Fortran 90 程序。我还没有测试它的 C 版本,但
编译器:gfortran-4.8.5 MPI 库:OpenMPI-1.7.2(预装 OpenSuSE 13.2) 这个程序: use mpi implicit none real*16 :
我有一个巨大的代码,其中有一个非常奇怪的 MPI 错误。 MPI 并行化是微不足道的,只需计算代码中某处的平均值,可以将其隔离为: // Declaration std::vector local;
我正在实现红黑 SOR 的并行版本。 我想获得每个进程的最大误差的 MPI_Allreduce 部分不起作用。它永远不会改变,即使只有一个过程,它也会给出高于 2.0 的值。怎么回事?? 这是代码,有
我需要使用 MPICH 创建集群。在这种情况下,我首先在一台机器上尝试了这些示例 ( http://mpitutorial.com/beginner-mpi-tutorial/ ),它们按预期工作。然
我正在尝试减少(求和)由 MPI_type_vector 创建的派生数据类型。当我运行代码时,它崩溃并提示减少 MPI_SUM 没有为非固有数据类型定义。我写了一段简单的代码来说明我的问题。该代码尝试
我正在使用 MPI 书中的示例代码 [很快就会给出名称]。 它的作用如下: a) 它创建两个通信器 world = MPI_COMM_WORLD,其中包含所有进程和 worker,其中不包括随机数生成
我是一名优秀的程序员,十分优秀!