分布式仿真思考(三)成功运行啦,哈哈哈

在我写的一篇文章中 

分布式仿真SNN的思考(二)-CSDN博客

在我实际的运行过程中,存在严重错误,导致我没有的到争取到结果,尤其是

分布式仿真思考(三)成功运行啦,哈哈哈_第1张图片

我们都知道localAdj[i].size()<=globalAdj[i].size()。但是实际情况却存在三种,

  1. 神经元的所有突触后神经元都在本地,即此时 localAdj[i].size()=globalAdj[i].size()
  2. 神经元的所有突触后神经元都不在本地,此时 localAdj[i].size()
  3. 神经元的所有突触后神经元有的在本地,有的不在本地。即localAdj[i].size()
  4. 神经元的所有突触后神经元为零,此时localAdj[i].size()=globalAdj[i].size()=0

所以原来我对代码为:

std::vector ConnectionManager::judge_remote_pluses(int sender_gid)
{
    std::vector result(0);

    std::vector partition = kernel().partition_manager.get_partition();

    int rank_ = kernel().mpi_manager.get_rank();
    if (local_adjcency[sender_gid].size() == global_adjacency[sender_gid].size())
    {
        return result;
    }
    else if (local_adjcency[sender_gid].size() < global_adjacency[sender_gid].size())
    {
        for (int ii = 0; ii < global_adjacency[sender_gid].size(); ii++)
        {
            //if (rank_ == 1)
            //{
            //    std::cout << "global adjency is :";
            //    Print(global_adjacency[sender_gid]);
            //    std::cout << "partition is :";
            //    Print(partition);
            //}
            if (partition[global_adjacency[sender_gid][ii]] != rank_)
            {
                result.push_back(partition[global_adjacency[sender_gid][ii]]);
            }
        }
    }
    return result;
}

这种写法漏掉第三种情况,所以我们还得重新分析。

仔细想,我们无非就要三种情况:

  1. 该神经元没有突触后神经元,返回false
  2. 该神经元存在本地脉冲,存在则返回ture
  3. 该神经元存在远程脉冲,返回远程脉冲所在的进程id集合

所以需要两个条件,先判断bool类型变量,在判断是否存在远程脉把代码改成:

void ConnectionManager::judge_remote_pluses(int sender_gid,bool* is_local, std::vector* remote_proc_id)
{
    std::cout << "sender_gid " << sender_gid << std::endl;
    std::vector partition = kernel().partition_manager.get_partition();

    int rank_ = kernel().mpi_manager.get_rank();

    if (local_adjcency[sender_gid].size() == global_adjacency[sender_gid].size())
    {
        *is_local = true;
    }
    else if(local_adjcency[sender_gid].size() < global_adjacency[sender_gid].size())
    {
        for (int ii = 0; ii < global_adjacency[sender_gid].size(); ii++)
        {

            if (partition[global_adjacency[sender_gid][ii]] == rank_)
            {
                *is_local = true;
            }
            else
            {
                (*remote_proc_id).push_back(partition[global_adjacency[sender_gid][ii]]);
            }
        }
    }
}

 终于,终于成功的进行了分布式的仿真,呜呜呜~,真不容易啊,来看效果

分布式仿真思考(三)成功运行啦,哈哈哈_第2张图片

分布式仿真思考(三)成功运行啦,哈哈哈_第3张图片

不过这个系列不会结束,我只是实现了最基本的功能,代码的注释和一些工作还没有做,算是一个小范围的成功,接下啦要再接再厉,加油 

你可能感兴趣的:(分布式模拟脉冲神经网络,分布式,wpf)