@startuml package layers #DDDDDD { enum Engine { CUSTOM NNPACK AVX AVX2 SSE OPENCL } class Node { } abstract class Layer { - EngineType engine + virtual void forward_propagation() + virtual void backward_propagation() } Node <|-- Layer class ConvolutionalLayer { } Layer <|-- ConvolutionalLayer } package core.kernels #DDDDDD { class OpKernelConstructor { } class OpKernelContext { } abstract class OpKernel { + OpKernel(OpKernelConstructor context) + virtual void compute(OpKernelContext context) } ConvolutionalLayer *-- OpKernel class Conv2dLibDNNOp { } class Conv2dOpenCLOp { } class Conv2dAVXOp { } OpKernel <|-- Conv2dLibDNNOp OpKernel <|-- Conv2dOpenCLOp OpKernel <|-- Conv2dAVXOp Conv2dLibDNNOp ..> Config Conv2dOpenCLOp ..> Config Conv2dAVXOp ..> Config } class Config { + bool hasAVX() + bool hasAVX2() + bool hasSSE() + bool hasNEON() + int availableGPUNum() } package core.framework #DDDDDD { class Context { - bool is_opencl - CLCudaAPI::Context device_context } class Device { - Context context + Device(DeviceType device_type) + Device(DeviceType device_type, int platform_id, int device_id) } class Program { - Device device - Layer op - CLCuda::Program op_program } note right: This is per layer type, not per Op. class OpenCLProgramManager { + registerOp(Device device, Layer op) } OpenCLProgramManager *-- Program Program *-- OpKernel } @enduml