在进行脉冲数据的传输时,如果一直采用事件的方式,比如我这样
struct SpikeEvent
{
int source_gid; //后神经元的gid
int stamp; //发射脉冲的时间
double delay; //读取到的突触上的延迟
double weight; //读取到的突触上的权重
SpikeEvent() :source_gid(0), stamp(0), delay(0), weight(0.0) {};
};
两个int和两个double一共占有24个字节,如果一万个脉冲就是240000,大约230多个kb这样看起来很小,但是如果使用mpi传输时,却会占有很大的时间。所以我采用一种压缩方式,记录一共脉冲仅仅需要他的发射神经元id以及发射的时间即可代码如下
#include<iostream>
using namespace std;
unsigned int encodeSpike(int spike_timing, int neuronId) {
unsigned int message = neuronId | (spike_timing << 27);
return message;
}
void decodeSpike(unsigned int message, int* spike_timing, int* neuronId) {
*neuronId = 0x07ffffff & message;
*spike_timing = message >> (27);
}
int main()
{
int spike_timing = 10, neuronId = 5;
auto message = encodeSpike(spike_timing, neuronId);
int s, n;
decodeSpike(message, &s, &n);
cout << s << " " << n << endl;
}
这样就完美的实现了对source_gid和spike_tim的压缩,使用了无符号int,仅仅四个字节就描述了一个脉冲时间,这样应该是最完美的。