caffe blobs 共享内存分析
1、caffe中内存分配情况
caffe层间的输入输出是以Blob为单位,每个Blob中存储有训练数据和梯度,caffe也给出了Blob级的接口函数。caffe在初始化阶段就会创建所有需要的内存,内存的消耗很大。尤其是对只做前向计算的情况,不必对所有的Blob都分配内存,前向计算过程中可以使用重用已经计算完成的Blob的内存,即:Blob间共享内存。
在说明Blob直接共享内存之前,先看下caffe的需要哪些内存:(caffe中memory_used_统计需要的内存是不完全的)
1、data_:存储计算过程层间输入和输出的中间结果,这个数据是caffe中memory_used_统计的数据。
2、diff_:存储反向计算过程中的梯度数据。
3、参数数据:计算模型参数,例如,卷积层和全连接等层的W、B的数据。
4、中间数据:例如:卷积层中im2col需要存储空间,pooling层中的max_index_需要的存储空间
5、其他一些数据:除了上面的数据其它的一些存储空间。
2、Blob间内存共享分析
由于在caffe的计算是一层一层串行执行的,所以当前层计算时,其它层开辟的空间是闲置的。所以考虑共享内存,即:后面层的计算重用前面层已经开辟的内存空间。具体就是输入和输出Blob的内存共享。
然而Blob中的data_执向的是syncMemory,syncMemory指向的才是真正的内存空间(见下图),所以如果共享内存,是不能再Blob级间共享的,需要在syncMemory间共享内存。
如上图(a)所示,blob1和blob2共享内存。blob级的共享实质是共享的syncMemory,顺带着共享了内存(红色区域)。如果blob2要调整空闲内存的空间,就会出现图(b)的情况,会为blob2重新分配一块内存空间。此时blob间就不在共享内存了。由于每层的输入和输出blob所需要的内存大小多数情况是不一致的。因此从blob级共享内存是不行,只能从syncMemory级共享内存。如下图:
上图(a)中blob1和blob2共享内存,是blob中syncMemory共享内存。当blob2需要更大的内存时,blob2就重新创建了一个大的Memroy2,并释放了之前的memory1。使得blob1和blob2重新指向一个新的内存。
因此如果要想实现共享内存,则必须是syncMemory级的共享内存。
(完)