C++ 使用mpi分配向量行

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_

我有一个遗传算法,我想和mpi并行。我有一个遗传数据类型的二维向量,我想在多个节点之间分布二维向量线块,我使用了scatterv函数,但我不知道这个函数是正确的,或者我没有设置这个函数的正确参数。在GMC类std::vector individual[108]中定义为公共参数的individual;请帮帮我

谢谢

我的代码如下:

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之前的版本)。