From 8f570c1ec5571b4c779e834d05eb3837b5d11058 Mon Sep 17 00:00:00 2001 From: Liangliang He Date: Thu, 11 Jan 2018 13:35:53 +0800 Subject: [PATCH] Resolve symbol obfuscation collision --- mace/core/runtime/opencl/opencl_runtime.cc | 29 +++++++-------- mace/kernels/opencl/addn.cc | 2 +- mace/kernels/opencl/batch_norm_opencl.cc | 2 +- mace/kernels/opencl/bias_add_opencl.cc | 2 +- mace/kernels/opencl/buffer_to_image.cc | 2 +- mace/kernels/opencl/concat.cc | 2 +- mace/kernels/opencl/conv_2d_opencl_1x1.cc | 2 +- mace/kernels/opencl/conv_2d_opencl_3x3.cc | 2 +- mace/kernels/opencl/conv_2d_opencl_general.cc | 2 +- .../opencl/depthwise_conv_opencl_3x3.cc | 2 +- mace/kernels/opencl/pooling_opencl.cc | 2 +- mace/kernels/opencl/relu_opencl.cc | 4 +-- mace/kernels/opencl/resize_bilinear_opencl.cc | 2 +- mace/kernels/opencl/softmax_opencl.cc | 2 +- mace/kernels/opencl/space_to_batch_opencl.cc | 2 +- mace/utils/tuner.h | 5 ++- mace/utils/utils.h | 36 +++++++++++++------ 17 files changed, 57 insertions(+), 43 deletions(-) diff --git a/mace/core/runtime/opencl/opencl_runtime.cc b/mace/core/runtime/opencl/opencl_runtime.cc index 4d799cac..065dc865 100644 --- a/mace/core/runtime/opencl/opencl_runtime.cc +++ b/mace/core/runtime/opencl/opencl_runtime.cc @@ -19,7 +19,7 @@ namespace { bool WriteFile(const std::string &filename, bool binary, const std::vector &content) { - std::ios_base::openmode mode = std::ios::out; + std::ios_base::openmode mode = std::ios_base::out | std::ios_base::trunc; if (binary) { mode |= std::ios::binary; } @@ -124,17 +124,14 @@ cl::CommandQueue &OpenCLRuntime::command_queue() { return *command_queue_; } std::string OpenCLRuntime::GenerateCLBinaryFilenamePrefix( const std::string &filename_msg) { -#ifdef MACE_OBFUSCATE_LITERALS - return ObfuscateSymbolWithCollision(filename_msg); -#else + // TODO This can be long and slow, fix it std::string filename_prefix = filename_msg; for (auto it = filename_prefix.begin(); it != filename_prefix.end(); ++it) { if (*it == ' ' || *it == '-' || *it == '=') { *it = '_'; } } - return filename_prefix; -#endif + return MACE_OBFUSCATE_SYMBOL(filename_prefix); } extern bool GetSourceOrBinaryProgram(const std::string &program_name, @@ -145,21 +142,24 @@ extern bool GetSourceOrBinaryProgram(const std::string &program_name, bool *is_opencl_binary); void OpenCLRuntime::BuildProgram(const std::string &program_name, - const std::string &binary_file_name_prefix, + const std::string &built_program_key, const std::string &build_options, cl::Program *program) { MACE_CHECK_NOTNULL(program); - bool is_opencl_binary = false; + std::string binary_file_name_prefix = + GenerateCLBinaryFilenamePrefix(built_program_key); std::vector program_vec; + bool is_opencl_binary; const bool found = GetSourceOrBinaryProgram(program_name, binary_file_name_prefix, context(), device(), program, &is_opencl_binary); - MACE_CHECK(found, "Program not found source: ", program_name, ", or binary: ", - binary_file_name_prefix); + MACE_CHECK(found, "Program not found for ", + is_opencl_binary ? "source: " : "binary: ", + built_program_key); // Build program std::string build_options_str = @@ -173,7 +173,10 @@ void OpenCLRuntime::BuildProgram(const std::string &program_name, program->getBuildInfo(device()); LOG(INFO) << "Program build log: " << build_log; } - LOG(FATAL) << "Build program failed: " << ret; + LOG(FATAL) << "Build program from " + << (is_opencl_binary ? "source: " : "binary: ") + << built_program_key + << " failed: " << ret; } if (!is_opencl_binary) { @@ -222,9 +225,7 @@ cl::Kernel OpenCLRuntime::BuildKernel( if (built_program_it != built_program_map_.end()) { program = built_program_it->second; } else { - std::string binary_file_name_prefix = - GenerateCLBinaryFilenamePrefix(built_program_key); - this->BuildProgram(program_name, binary_file_name_prefix, + this->BuildProgram(program_name, built_program_key, build_options_str, &program); built_program_map_.emplace(built_program_key, program); } diff --git a/mace/kernels/opencl/addn.cc b/mace/kernels/opencl/addn.cc index ce09002c..b4079dc3 100644 --- a/mace/kernels/opencl/addn.cc +++ b/mace/kernels/opencl/addn.cc @@ -31,7 +31,7 @@ static void AddN(const std::vector &input_tensors, auto runtime = OpenCLRuntime::Global(); std::set built_options; auto dt = DataTypeToEnum::value; - std::string kernel_name = MACE_KERNRL_NAME("addn"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("addn"); built_options.emplace("-Daddn=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/batch_norm_opencl.cc b/mace/kernels/opencl/batch_norm_opencl.cc index 2fc8f79f..ba0e0c2e 100644 --- a/mace/kernels/opencl/batch_norm_opencl.cc +++ b/mace/kernels/opencl/batch_norm_opencl.cc @@ -34,7 +34,7 @@ void BatchNormFunctor::operator()( auto runtime = OpenCLRuntime::Global(); std::set built_options; auto dt = DataTypeToEnum::value; - std::string kernel_name = MACE_KERNRL_NAME("batch_norm"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("batch_norm"); built_options.emplace("-Dbatch_norm=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/bias_add_opencl.cc b/mace/kernels/opencl/bias_add_opencl.cc index ce896a64..b85bb860 100644 --- a/mace/kernels/opencl/bias_add_opencl.cc +++ b/mace/kernels/opencl/bias_add_opencl.cc @@ -31,7 +31,7 @@ void BiasAddFunctor::operator()( auto runtime = OpenCLRuntime::Global(); std::set built_options; auto dt = DataTypeToEnum::value; - std::string kernel_name = MACE_KERNRL_NAME("bias_add"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("bias_add"); built_options.emplace("-Dbias_add=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/buffer_to_image.cc b/mace/kernels/opencl/buffer_to_image.cc index d69cce54..d5260870 100644 --- a/mace/kernels/opencl/buffer_to_image.cc +++ b/mace/kernels/opencl/buffer_to_image.cc @@ -37,7 +37,7 @@ void BufferToImageFunctor::operator()(Tensor *buffer, kernel_name = i2b_ ? "arg_image_to_buffer" : "arg_buffer_to_image"; break; } - string obfuscated_kernel_name = MACE_KERNRL_NAME(kernel_name); + string obfuscated_kernel_name = MACE_OBFUSCATE_SYMBOL(kernel_name); std::set built_options; std::stringstream kernel_name_ss; kernel_name_ss << "-D" << kernel_name << "=" << obfuscated_kernel_name; diff --git a/mace/kernels/opencl/concat.cc b/mace/kernels/opencl/concat.cc index 6c557c04..a02b1552 100644 --- a/mace/kernels/opencl/concat.cc +++ b/mace/kernels/opencl/concat.cc @@ -25,7 +25,7 @@ static void Concat2(const Tensor *input0, auto runtime = OpenCLRuntime::Global(); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("concat_channel"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("concat_channel"); built_options.emplace("-Dconcat_channel=" + kernel_name); if (input0->dtype() == output->dtype()) { built_options.emplace("-DDATA_TYPE=" + DtToCLDt(dt)); diff --git a/mace/kernels/opencl/conv_2d_opencl_1x1.cc b/mace/kernels/opencl/conv_2d_opencl_1x1.cc index 525731ea..0269c314 100644 --- a/mace/kernels/opencl/conv_2d_opencl_1x1.cc +++ b/mace/kernels/opencl/conv_2d_opencl_1x1.cc @@ -36,7 +36,7 @@ void Conv1x1(const Tensor *input, MACE_CHECK(input_batch == batch); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("conv_2d_1x1"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("conv_2d_1x1"); built_options.emplace("-Dconv_2d_1x1=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/conv_2d_opencl_3x3.cc b/mace/kernels/opencl/conv_2d_opencl_3x3.cc index 93156cb6..16d86330 100644 --- a/mace/kernels/opencl/conv_2d_opencl_3x3.cc +++ b/mace/kernels/opencl/conv_2d_opencl_3x3.cc @@ -28,7 +28,7 @@ static void Conv2d3x3S12(const Tensor *input, const Tensor *filter, const index_t width_blocks = RoundUpDiv(width); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("conv_2d_3x3"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("conv_2d_3x3"); built_options.emplace("-Dconv_2d_3x3=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/conv_2d_opencl_general.cc b/mace/kernels/opencl/conv_2d_opencl_general.cc index 7d42ab94..caf6d587 100644 --- a/mace/kernels/opencl/conv_2d_opencl_general.cc +++ b/mace/kernels/opencl/conv_2d_opencl_general.cc @@ -28,7 +28,7 @@ void Conv2dOpencl(const Tensor *input, const Tensor *filter, const index_t width_blocks = RoundUpDiv4(width); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("conv_2d"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("conv_2d"); built_options.emplace("-Dconv_2d=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); diff --git a/mace/kernels/opencl/depthwise_conv_opencl_3x3.cc b/mace/kernels/opencl/depthwise_conv_opencl_3x3.cc index cc928921..ff8420fc 100644 --- a/mace/kernels/opencl/depthwise_conv_opencl_3x3.cc +++ b/mace/kernels/opencl/depthwise_conv_opencl_3x3.cc @@ -33,7 +33,7 @@ static void InnerDepthwiseConvOpenclK3x3S12(const Tensor *input, auto runtime = OpenCLRuntime::Global(); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("depthwise_conv_3x3"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("depthwise_conv_3x3"); built_options.emplace("-Ddepthwise_conv_3x3=" + kernel_name); built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(input->dtype())); built_options.emplace(stride == 1 ? "-DSTRIDE_1" : ""); diff --git a/mace/kernels/opencl/pooling_opencl.cc b/mace/kernels/opencl/pooling_opencl.cc index 42b62fa2..79a6f102 100644 --- a/mace/kernels/opencl/pooling_opencl.cc +++ b/mace/kernels/opencl/pooling_opencl.cc @@ -28,7 +28,7 @@ static void Pooling(const Tensor *input, auto runtime = OpenCLRuntime::Global(); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("pooling"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("pooling"); built_options.emplace("-Dpooling=" + kernel_name); if (type == MAX && input->dtype() == output->dtype()) { built_options.emplace("-DDATA_TYPE=" + DtToCLDt(dt)); diff --git a/mace/kernels/opencl/relu_opencl.cc b/mace/kernels/opencl/relu_opencl.cc index 2a993b90..30f81739 100644 --- a/mace/kernels/opencl/relu_opencl.cc +++ b/mace/kernels/opencl/relu_opencl.cc @@ -32,7 +32,7 @@ void ReluFunctor::operator()(const Tensor *input, built_options.emplace("-DCMD_DATA_TYPE=" + DtToUpstreamCLCMDDt(dt)); cl::Kernel relu_kernel; if (max_limit_ < 0) { - std::string kernel_name = MACE_KERNRL_NAME("relu"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("relu"); built_options.emplace("-Drelu=" + kernel_name); relu_kernel = runtime->BuildKernel("relu", kernel_name, built_options); @@ -40,7 +40,7 @@ void ReluFunctor::operator()(const Tensor *input, relu_kernel.setArg(idx++, *(static_cast(input->buffer()))); relu_kernel.setArg(idx++, *(static_cast(output->buffer()))); } else { - std::string kernel_name = MACE_KERNRL_NAME("relux"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("relux"); built_options.emplace("-Drelux=" + kernel_name); relu_kernel = runtime->BuildKernel("relu", kernel_name, built_options); diff --git a/mace/kernels/opencl/resize_bilinear_opencl.cc b/mace/kernels/opencl/resize_bilinear_opencl.cc index 3180416a..dc0d8cd0 100644 --- a/mace/kernels/opencl/resize_bilinear_opencl.cc +++ b/mace/kernels/opencl/resize_bilinear_opencl.cc @@ -40,7 +40,7 @@ void ResizeBilinearFunctor::operator()( auto runtime = OpenCLRuntime::Global(); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("resize_bilinear_nocache"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("resize_bilinear_nocache"); built_options.emplace("-Dresize_bilinear_nocache=" + kernel_name); auto dt = DataTypeToEnum::value; built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); diff --git a/mace/kernels/opencl/softmax_opencl.cc b/mace/kernels/opencl/softmax_opencl.cc index 506f9b81..bfc75e73 100644 --- a/mace/kernels/opencl/softmax_opencl.cc +++ b/mace/kernels/opencl/softmax_opencl.cc @@ -26,7 +26,7 @@ void SoftmaxFunctor::operator()(const Tensor *logits, auto runtime = OpenCLRuntime::Global(); std::set built_options; - std::string kernel_name = MACE_KERNRL_NAME("softmax"); + std::string kernel_name = MACE_OBFUSCATE_SYMBOL("softmax"); built_options.emplace("-Dsoftmax=" + kernel_name); auto dt = DataTypeToEnum::value; built_options.emplace("-DDATA_TYPE=" + DtToUpstreamCLDt(dt)); diff --git a/mace/kernels/opencl/space_to_batch_opencl.cc b/mace/kernels/opencl/space_to_batch_opencl.cc index 0b53afeb..1fd5bf1a 100644 --- a/mace/kernels/opencl/space_to_batch_opencl.cc +++ b/mace/kernels/opencl/space_to_batch_opencl.cc @@ -30,7 +30,7 @@ void SpaceToBatchFunctor::operator()(Tensor *space_tensor batch_tensor->ResizeImage(output_shape, output_image_shape); kernel_name = "space_to_batch"; } - std::string obfuscated_kernel_name = MACE_KERNRL_NAME(kernel_name); + std::string obfuscated_kernel_name = MACE_OBFUSCATE_SYMBOL(kernel_name); auto runtime = OpenCLRuntime::Global(); std::set built_options; std::stringstream kernel_name_ss; diff --git a/mace/utils/tuner.h b/mace/utils/tuner.h index 536e0a04..b7364e66 100644 --- a/mace/utils/tuner.h +++ b/mace/utils/tuner.h @@ -46,7 +46,7 @@ class Tuner { ¶m_generator, const std::function &)> &func, Timer *timer) { - std::string obfucated_param_key = MACE_OBFUSCATE_SYMBOLS(param_key); + std::string obfucated_param_key = MACE_OBFUSCATE_SYMBOL(param_key); if (IsTuning() && param_generator != nullptr) { // tune std::vector opt_param = default_param; @@ -92,8 +92,7 @@ class Tuner { int32_t key_size = kp.first.size(); ofs.write(reinterpret_cast(&key_size), sizeof(key_size)); ofs.write(kp.first.c_str(), key_size); - VLOG(1) << "Write tuning param: " - << MACE_OBFUSCATE_SYMBOLS(kp.first.c_str()); + VLOG(1) << "Write tuning param: " << kp.first.c_str(); auto ¶ms = kp.second; int32_t params_size = params.size() * sizeof(param_type); diff --git a/mace/utils/utils.h b/mace/utils/utils.h index 606f21f2..0239197f 100644 --- a/mace/utils/utils.h +++ b/mace/utils/utils.h @@ -65,26 +65,40 @@ inline std::string ObfuscateString(const std::string &src) { } // Obfuscate synbol or path string -inline std::string ObfuscateSymbolWithCollision(const std::string &src) { - std::string dest = ObfuscateString(src); +inline std::string ObfuscateSymbol(const std::string &src) { + std::string dest = src; + if (dest.empty()) { + return dest; + } + dest[0] = src[0]; // avoid invalid symbol which starts from 0-9 const std::string encode_dict = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - for (int i = 0; i < src.size(); i++) { - dest[i] = encode_dict[dest[i] % encode_dict.size()]; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; + for (int i = 1; i < src.size(); i++) { + char ch = src[i]; + int idx; + if (ch >= '0' && ch <= '9') { + idx = ch - '0'; + } else if (ch >= 'a' && ch <= 'z') { + idx = 10 + ch - 'a'; + } else if (ch >= 'A' && ch <= 'Z') { + idx = 10 + 26 + ch - 'a'; + } else if (ch == '_') { + idx = 10 + 26 + 26; + } else { + dest[i] = ch; + continue; + } + dest[i] = encode_dict[(idx + 37) % encode_dict.size()]; } return std::move(dest); } #ifdef MACE_OBFUSCATE_LITERALS #define MACE_OBFUSCATE_STRING(str) ObfuscateString(str) -// This table is delibratedly selected to avoid '\0' in genereated literal -#define MACE_OBFUSCATE_SYMBOLS(str) ObfuscateString(str, "!@#$%^&*()+?") -// OpenCL will report error if there is name collision -#define MACE_KERNRL_NAME(name) ObfuscateSymbolWithCollision(name) +#define MACE_OBFUSCATE_SYMBOL(str) ObfuscateSymbol(str) #else #define MACE_OBFUSCATE_STRING(str) (str) -#define MACE_OBFUSCATE_SYMBOLS(str) (str) -#define MACE_KERNRL_NAME(name) (name) +#define MACE_OBFUSCATE_SYMBOL(str) (str) #endif } // namespace mace -- GitLab