是否应该移除对device_id的假设,以及类似use_gpu这样的bool变量
Created by: shijiaxin
Paddle中的变量device_id,在-1的时候表示CPU,在大于等于0的时候表示GPU,这样带来很大的限制,就是很难再支持除了Nvidia GPU和CPU之外的其他设备,也难以支持不同的实现方式。而且这样的需求还是很多的,比如让Paddle支持FPGA,ASIC芯片,AMD的GPU。
现在已经被merge的关于intel-mkldnn的代码也碰到了类似的问题,它的数据存储格式与CPU的格式不一样,因此需要实现一个MKLDNNMatrix.h,device_id类型使用-2,这显然不大合理。
如果需要加入其它的设备如FPGA,有一个基本的需求是占用多个device_id,而0以上的device_id已经被假设为GPU了,很难再分配出多个device_id,(难道用-3到-xxx?)。
另一个问题也类似,就是Paddle假设设备除了CPU,就是Nvidia的GPU,因此使用了use_gpu这样的bool变量,而不是用一个枚举类型来表示设备类型,添加新的设备支持就会变得十分困难。
重构中的代码有DeviceContext这样的类型,看起来比较容易支持新的Device,但到了具体实现的时候仍会有bool类型的判断,代码如下,如果一个CPU的Place和一个FPGA的Place判断,就会被判定为相等:
bool places_are_same_class(const Place &p1, const Place &p2) {
return is_gpu_place(p1) == is_gpu_place(p2);
}