您好我在实现条带化算法时遇到了问题。我也遇到了在一个向量中加载30000条记录的问题,我试过了,但它无法正常工作。
程序应该声明变量以一次存储一个RECORD。它应该读取记录并处理它然后读取另一条记录,依此类推。每个进程都应该忽略“属于”另一个进程的记录。这可以通过跟踪记录计数并确定是否应该处理或忽略当前记录来完成。例如,如果有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
}
答案 0 :(得分: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
个记录,直到达到或超过#。