diff --git a/paddle/utils/CpuId.h b/paddle/utils/CpuId.h index 0f3985cc7b2c018ede9bba9644d2d096561dccee..5fc610964d4f5b8064f16ebf1b26bbb002264ce1 100644 --- a/paddle/utils/CpuId.h +++ b/paddle/utils/CpuId.h @@ -12,6 +12,7 @@ limitations under the License. */ #pragma once #include "Common.h" +#include "Error.h" namespace paddle { @@ -97,4 +98,37 @@ private: #define HAS_AVX512 HAS_SIMD(SIMD_AVX512) // clang-format on +/** + * Invoke checkCPUFeature() before Paddle initialization to + * check target machine whether support compiled instructions. + * If not, simply throw out an error. + */ +inline Error __must_check checkCPUFeature() { + Error err; +#ifndef __AVX__ + if (HAS_AVX) { + LOG(WARNING) << "PaddlePaddle wasn't compiled to use avx instructions, " + << "but these are available on your machine and could " + << "speed up CPU computations via CMAKE .. -DWITH_AVX=ON"; + } +#else + if (!HAS_AVX) { + err = Error( + "PaddlePaddle was compiled to use avx instructions, " + "but these aren't available on your machine, please " + "disable it via CMAKE .. -DWITH_AVX=OFF"); + } +#endif // __AVX__ +#ifdef __SSE3__ + if (!HAS_SSE3) { + err = Error( + "PaddlePaddle was compiled to use sse3 instructions, " + "which is the minimum requirement of PaddlePaddle. " + "But these aren't available on your current machine."); + } +#endif // __SSE3__ + + return err; +} + } // namespace paddle diff --git a/paddle/utils/Util.cpp b/paddle/utils/Util.cpp index dbab4ec43ca2fa691445131d2cb14f51721a2e4c..1f56b6b8a96602d298507452fc7182d46179de41 100644 --- a/paddle/utils/Util.cpp +++ b/paddle/utils/Util.cpp @@ -26,6 +26,7 @@ limitations under the License. */ #include +#include "CpuId.h" #include "CustomStackTrace.h" #include "Logging.h" #include "StringUtil.h" @@ -185,6 +186,7 @@ void initMain(int argc, char** argv) { } version::printVersion(); + checkCPUFeature().check(); runInitFunctions(); }