C++ 使用mpi分配向量行
我有一个遗传算法,我想和mpi并行。我有一个遗传数据类型的二维向量,我想在多个节点之间分布二维向量线块,我使用了scatterv函数,但我不知道这个函数是正确的,或者我没有设置这个函数的正确参数。在GMC类std::vector individual[108]中定义为公共参数的individual;请帮帮我 谢谢 我的代码如下:C++ 使用mpi分配向量行,c++,mpi,genetic-algorithm,C++,Mpi,Genetic Algorithm,我有一个遗传算法,我想和mpi并行。我有一个遗传数据类型的二维向量,我想在多个节点之间分布二维向量线块,我使用了scatterv函数,但我不知道这个函数是正确的,或者我没有设置这个函数的正确参数。在GMC类std::vector individual[108]中定义为公共参数的individual;请帮帮我 谢谢 我的代码如下: int main(int argc, char *argv[]) { GMC(GraphName, 125); int size, rank,divided_pop_
int main(int argc, char *argv[]) {
GMC(GraphName, 125);
int size, rank,divided_pop_size,sum=0;
vector<vector <int>> recbuf;
int *sendcounts; //specifying the number of elements to send to each processor
int *displs; //Entry i specifies the displacement
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("Hello world from process %d of %d\n", rank, size);
sendcounts = new int[size];
displs = new int[size];
divided_pop_size = n_initial_pop*num_vertices / size;
for (int i = 0; i < size; i++) {
sendcounts[i] = (divided_pop_size);
displs[i] = sum;
sum += sendcounts[i];
}
recbuf.resize(divided_pop_size);
if (rank == 0)
{
read_graph();
vertex_degrees();
initial_population();
}
MPI_Scatterv(&individual, sendcounts, displs, MPI_INT, &recbuf, sendcounts[rank] , MPI_INT, 0, MPI_COMM_WORLD);
if (rank==0) {
for (int i = 0; i < size; i++) {
printf("sendcounts[%d] = %d\tdispls[%d] = %d\n", i, sendcounts[i], i, displs[i]);
}
}
printf("%d: ", rank);
for (int i = 0; i < sendcounts[rank]; i++) {
printf("%c\t", recbuf[i]);
}
/*
for (int i = 0; i < size; i++)
{
//MPI_Recv()//a
//MPI_Recv()//indivual/size
for (int i = 0; i < divided_pop_size; i++)
{
//Extend_into_MaximalClique(i);
//fitness(i);
}
}
if (rank == 0)
//MPI_Gatherv();
*/
MPI_Finalize();
for (int j = 0; j < n_initial_pop; j++)
{
//manipulation_Gen();
}
return 0;
intmain(intargc,char*argv[]){
GMC(图125);
整数大小,秩,除以pop大小,和=0;
向量recbuf;
int*sendcounts;//指定要发送到每个处理器的元素数
int*disfs;//条目i指定位移
MPI_Init(&argc,&argv);
MPI_通信大小(MPI_通信世界和大小);
MPI通信等级(MPI通信世界和等级);
printf(“来自进程%d的Hello world,共%d\n”,等级,大小);
sendcounts=新整数[大小];
显示=新的整数[大小];
分割的\u pop\u size=n\u初始\u pop*num\u顶点/大小;
对于(int i=0;i
}您是否考虑过查看结果并尝试确定结果是否正确?我对使用MPI/任何其他分布式计算系统的建议。首先阅读它的方法,并选择一个适合你的问题。接下来,学习如何在一些简单、易于测试的示例问题上使用某些方法(在本例中为
MPI\u Scatterv
),然后尝试将其应用于实际场景中。一些参数在代码中没有定义,特别是MPI\u Scatterv
中的个体。如果没有数据,也没有更多关于搜索结果的解释,很难知道数据是否按需要传递。此外,每个处理器传递的数据量是相同的,因此MPI\u Scatter
可以更容易地在这里使用&somevec
,其中somevec
是std::vector
最明显地不会呈现您期望的结果。您应该使用somevec.data()
(C++11)或somevec[0]
(C++11之前的版本)。