【竞品调研】TensorFlow Lite GPU OpenCL在卷积上的选择策略
ysh329 opened this issue · comments
ysh329 commented
// tensorflow/tensorflow/lite/delegates/gpu/cl/selectors/convolution_selector.cc
// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/gpu/cl/selectors/convolution_selector.cc#L40
std::unique_ptr<GPUOperation> SelectConvolution(
const Convolution2DAttributes& attr, const BHWC& dst_shape,
const DeviceInfo& device_info, const OperationDef& op_def,
ModelHints hints) {
if (device_info.IsAdreno()) {
return SelectConvolutionAdreno(attr, dst_shape, device_info, op_def, hints);
} else if (device_info.IsPowerVR() || device_info.IsAMD() ||
device_info.IsIntel()) {
return SelectConvolutionPowerVR(attr, device_info, op_def);
} else if (device_info.IsNvidia()) {
return SelectConvolutionNVidia(attr, dst_shape, device_info, op_def);
} else if (device_info.IsMali()) {
return SelectConvolutionMali(attr, dst_shape, device_info, op_def);
} else {
return SelectConvolutionAdreno(attr, dst_shape, device_info, op_def, hints);
}
}
std::unique_ptr<GPUOperation> SelectConvolutionForWinograd(
const Convolution2DAttributes& attr, const BHWC& dst_shape,
const DeviceInfo& device_info, const OperationDef& op_def,
ModelHints hints) {
if (device_info.IsAdreno()) {
return SelectConvolutionWinogradAdreno(attr, dst_shape, device_info, op_def,
hints);
} else if (device_info.IsPowerVR() || device_info.IsAMD() ||
device_info.IsNvidia() || device_info.IsIntel()) {
ConvPowerVR conv =
CreateConvPowerVRWino4x4To6x6(device_info, op_def, attr, &dst_shape);
return absl::make_unique<ConvPowerVR>(std::move(conv));
} else if (device_info.IsMali()) {
return SelectConvolutionWinogradMali(attr, dst_shape, device_info, op_def);
} else {
return SelectConvolutionWinogradAdreno(attr, dst_shape, device_info, op_def,
hints);
}
}
std::unique_ptr<GPUOperation> SelectConvolutionWithDynamicWeights(
const Convolution2DAttributes& attr, const BHWC& weights_shape,
const BHWC& dst_shape, const DeviceInfo& device_info,
const OperationDef& op_def, ModelHints hints,
ConvWeightsDescription* weights_desc) {
if (device_info.IsAdreno()) {
return SelectConvolutionDynamicWeightsAdreno(attr, weights_shape, dst_shape,
device_info, op_def, hints,
weights_desc);
} else if (device_info.IsMali()) {
return SelectConvolutionDynamicWeightsMali(attr, weights_shape, dst_shape,
device_info, op_def, hints,
weights_desc);
} else {
ConvPowerVR conv = CreateConvPowerVRDynamicWeights(
device_info, op_def, attr, weights_shape, &dst_shape);
*weights_desc = conv.GetConvWeightsDescription();
return absl::make_unique<ConvPowerVR>(std::move(conv));
}
}