2

我正在尝试根据我在应用程序中使用的进程数将向量拆分为子集。我创建了伪代码,但我真的不知道如何输出子集。

问题:

使用条带化从 Residences.dat 中读取地址记录的子集。对于 n 个进程,每个进程根据每第 n 个记录评估一个唯一的记录子集。此子集中的记录数应约为 #-of-residence-records /#-of-processes。在所有使用的并行进程中,不应省略任何地址,并且不应多次处理。另请注意,任何进程一次只能将一条记录存储在内存中

我的代码:

std::vector<Residence> spliteResidenceDaata(vector<Residence> rs,int numProces = 0);
function body 

    std::vector<Residence> spliteResidenceDaata(vector<Residence> rs,int numProces)
    {

        std::vector<Residence> residenceSet;
        //get the size of vector
        int res_set_size = rs.size();
        int sizrOfSubSet =res_set_size/numProces;

        //output the arry subsite some "help here"

        return residenceSet;
    }

更新

I came up with this pseudo code
1-take the number of line in .dat file  rData
2- get the number of data you want to read for each process sizeofLine  (rData.size()/numProc)
3- read the .dat file from line 0 to  sizeofLine
4-output array 
4

2 回答 2

1

我还没有测试过这段代码,但是类似的东西应该可以工作——而不是让你的函数返回一个向量,而是让它返回一个向量的向量,如下所示:

std::vector<std::vector<Residence>> split(std::vector<Residence rs, int num_procs)

这将允许您将原始向量拆分为num_procs多个向量,然后将push_back()每个向量拆分为向量的返回向量(有点像矩阵)。

std::vector<std::vector<Residence>> split(const std::vector<Residence> rs, const unsigned num_procs) {
    unsigned j = 0; //position counter
    std::vector<std::vector<Residence>> result; //resulting vector of vectors
    for(unsigned i = 0; i < num_procs; ++i) {   //for each process
        std::vector<Residence> temp;            //create a vector
        for(; j < ((i + 1) * rs.size() / num_procs; ++j)    //iterate
            temp.push_back(rs[j]);              //and populate temporary vector with a 1/num_procs section of original vector
        result.push_back(temp);                 //and push that temporary vector into your result vector of vectors
    }
    for(; j < rs.size(); ++j)                   //finally, if the original vector is not divisible by num_procs
        result[num_procs].push_back(rs[j]);     //push the remainder of elements into the last vector
}

当你调用这个函数时,它看起来像这样:

std::vector<std::vector<Residence>> vectors = split(original_vector, 4);

这将允许您获得这样的子向量:

vectors[0];   //first quarter
vectors[1];   //second
vectors[2];   //third
vectors[3];   //fourth + remainder
于 2013-11-11T01:33:18.610 回答
0

您需要一次读取一条记录而不将所有子集作为向量传递,认为您需要这个 while(!residenceFile.eof()) { ResidenceFile >> res.x >>res.y;

    if ( numLines % numProcs == rank)
    {
        //call the  process
        //populate_distancesVector(res,foodbankData);
        analysis_range(populate_distancesVector(res,foodbankData),count);

    }
    ++numLines;

} 
于 2013-11-19T04:25:59.760 回答