0

嗨,我在实现条带化算法时遇到了麻烦。我在一个向量中加载 30000 条记录时也遇到问题,我试过这个,但它不起作用。

程序应声明变量以一次存储一个记录。它应该读取一条记录并处理它,然后读取另一条记录,依此类推。每个进程都应该忽略“属于”另一个进程的记录。这可以通过跟踪记录计数并确定是否应处理或忽略当前记录来完成。例如,如果有 4 个进程 (numProcs = 4),进程 0 应该处理记录 0、4、8、12,...(假设我们从 0 开始计数)并忽略其间的所有其他记录。`

   Residence res;
int numProcs = 4;
int linesNum = 0;
int recCount = 0;
int count = 0;

while(count  <=  numProcs)
{
    while(!residenceFile.eof())
   {
        ++recCount;
      //distancess.push_back(populate_distancesVector(res,foodbankData));
        if(recCount % processIS  == linesNum)
        {
           residenceFile >> res.x >>res.y;
           distancess.push_back(populate_distancesVector(res,foodbankData));
       }
      ++linesNum;

   }
    ++count;
}

更新代码

Residence res;
int numProcs = 1;
int recCount = 0;



    while(!residenceFile.eof())
    {
        residenceFile >> res.x >>res.y;

        //distancess.push_back(populate_distancesVector(res,foodbankData));
        if ( recCount == processId)//process id
        {
            distancess.push_back(populate_distancesVector(res,foodbankData));
        }
        ++recCount;
        if(recCount == processId )
            recCount = 0;
    }

更新 sudo 代码

 while(!residenceFile.eof())
    {
        residenceFile >> res.x >>res.y;


        if ( recCount % numProcs == numLines)
        {
            distancess.push_back(populate_distancesVector(res,foodbankData));
        }
        else
          ++numLines
        ++recCount
    }
4

2 回答 2

0

将作用于记录 0 和 4 的进程仍必须读取记录 1、2 和 3(才能到达 4)。

此外,while(!residenceFile.eof())这不是遍历文件的好方法;它将在结束后读取一轮。做类似的事情while(residenceFile >> res.x >>res.y)

至于制作一个包含 30,000 条记录的向量,这听起来像是内存限制。你确定你一次需要这么多内存吗?

编辑:

仔细查看更新的代码。如果进程 ID ( numProcs) 为零,则进程将作用于第一条记录,而不是其他记录;如果它是别的东西,它不会它们起作用。

编辑:

唉,我不懂阿拉伯语。我会尽量用英文解释清楚。

在尝试困难的技术之前,您必须先学习一种简单的技术。如果你猜测算法,你就会失败。

首先,编写一个循环,迭代 {0,1,2,3,...} 并打印出所有数字:

int i=0;
while(i<10)
{
  cout << i << endl;
  ++i;
}

在走得更远之前了解这一点。然后编写一个以相同方式迭代的循环,但只打印出 {0,4,8,...}:

int i=0;
while(i<10)
{
  if(i%4==0)
    cout << i << endl;
  ++i;
}

在走得更远之前了解这一点。然后编写一个只打印 {1,5,9,...} 的循环。然后编写一个读取文件的循环,并报告每条记录。然后将其与上一个练习的逻辑相结合,每四条记录中只报告一条。

从小而简单的事情开始。在小措施中增加复杂性。孤立地开发新技术。测试每一步。永远不要添加不起作用的代码。这是编写有效代码的方法。

于 2013-11-12T03:06:10.043 回答
0

您已使用 MPI 标记了您的帖子,但我没有看到您正在检查处理器 ID 以查看它应该处理哪些记录的任何地方。

用于解决我认为您要问的问题的伪代码:

While(there are more records){
If record count % numProcs == myID
   ProcessRecord
else
   Increment file stream pointer forward one record without processing
Increment Record Count
}

如果您事先知道将要处理的记录数,那么您可以想出一个更聪明的解决方案,将文件流指针向前移动numprocs记录,直到达到或超过该记录数。

于 2013-11-12T03:13:52.223 回答