本文介绍: 所幸,在配置MPI环境时保存了之前的版本, 又重新配置了MPI环境,还好没问题,不得不说,有时候写代码真的跟玄学一样,但保存备份真的是一个无比好的习惯,赞颂。现在最大的问题是:因为创建SNN网络的时候,种群之间的连接是随机的。终于可以写MPI了,没想到,刚开始就当头一棒,我按照之前的配置MPI环境,配置完成就报错。SNN分区阶段:主要是对SNN网络进行分区比如轮询方式,均匀的分配每一个神经元。目前已经实现了网络的创建阶段,又实现了一个简单的轮询分区阶段。创建网络阶段:主要是神经元的创建和 神经元的连接。
终于可以写MPI了,没想到,刚开始就当头一棒,我按照之前的配置MPI环境,配置完成就报错
好家伙,仔细检查了每一个步骤都没找到问题,上网搜索了一些解决方案,也没有解决。所幸,在配置MPI环境时保存了之前的版本, 又重新配置了MPI环境,还好没问题,不得不说,有时候写代码真的跟玄学一样,但保存备份真的是一个无比好的习惯,赞颂。
SNN分区阶段:主要是对SNN网络进行分区比如轮询方式,均匀的分配每一个神经元
// 神经元的邻接表
std::vector<std::vector<int>> global_adjacency;
// 本地的邻接表
std::vector<std::vector<int>> local_adjcency;
//本地的突触集合
std::vector<int> local_node_gids;
//本地神经元集合
std::vector< Neuron* > local_nodes;
//本地突触集合
std::vector< std::vector< Synapse* > > local_synapases;
目前已经实现了网络的创建阶段,又实现了一个简单的轮询分区阶段
void PartitionManager::perform_partitioning(const std::vector<std::vector<int>>& global_adjacency, std::vector<std::vector<int>>* local_adjacency, std::vector<int>* local_node_gids)
{
partition.resize(global_adjacency.size());
int nPart = kernel().mpi_manager.get_num_processes();
int rank = kernel().mpi_manager.get_rank();
for (int i = 0; i < partition.size(); i++) {
partition[i] = i % nPart;
}
for (int ii = 0; ii < global_adjacency.size(); ii++)
{
if (rank == partition[ii])
{
local_node_gids->push_back(ii);
}
for (int jj = 0; jj < global_adjacency[ii].size(); jj++)
{
//如果与这个节点连接的节点也在该进程
if (partition[global_adjacency[ii][jj]] == rank)
{
(*local_adjacency)[ii].push_back(global_adjacency[ii][jj]);
}
}
}
}
还是很符合预期的。
现在最大的问题是:因为创建SNN网络的时候,种群之间的连接是随机的。如果每个进程都执行一次SNN创建,那么不同进程肯定得到不一样的邻接表。
目前的想法就是设立一个主进程。网络的创建在主进程中实现,然后再分发给其他进程。或者保证每个进程的SNN创建是相同的。
愁人啊
原文地址:https://blog.csdn.net/qq_39591612/article/details/134801966
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_44030.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。