MPI_Allreduce doubles
MPI_Allreduce doubles
我正试图找到所有处理器的全局最小值和最大值,以进行我正在进行的排序。我正在尝试使用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;
显示了我的代码,每次都出现分段错误。这是在一个简单的函数中,并使用使用
生成的随机双精度对象调用: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) );
}
如果有人知道为什么这个segfault,请告诉我。我真的很想在一个快速简单的方式获得全局最大值和最小值
你真的需要在这里使用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;
我做了一些读取,MINLOC和MAXLOC操作需要使用一个大小> 1的数组来存储值和排名。
我更新的代码
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[2];
local_min[1] = rank;
local_min[0] = *std::min_element(values_to_sort.begin(), values_to_sort.end());
double local_max[2];
local_max[1] = rank;
local_max[0] = *std::max_element(values_to_sort.begin(), values_to_sort.end());
double global_min[2];
double global_max[2];
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[0] << " local_max " << local_max[0] << endl;
cout << "global_min " << global_min[0] << " global_max " << global_max[0] << endl;
相关文章:
- 在C++/Visual Studio中,通过给定数据格式(doubles、float、int、1位bools)的UDP发
- 在libc++和glibc中,解析doubles时字符串流行为不一致
- 从const doubles的指针返回指向double的指针
- 从字符串、char和doubles文件中只读取doubles
- 处理doubles时使用的模运算符
- 在doubles数组上使用unordered_map
- 如何使用MPI Allreduce添加armadillo矢量
- MPI_Allreduce doubles
- 初始化向量 C++ 的向量<doubles>
- 我的包编译后,get函数可以工作,除了它打印随机数的doubles
- boost::random和boost:uniform_real适用于doubles,而不适用于float
- Ints和Doubles的输入验证