diff --git a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp index 17ba406b657..f0b3ffda564 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -518,6 +518,40 @@ bool isConversionTruncatesRange(const Precision & from, const Precision & to) { INTEL_CPU_CVT(FP32, FP32), INTEL_CPU_CVT(FP16, FP16), INTEL_CPU_CVT(BF16, BF16), INTEL_CPU_CVT(FP64, FP64), \ INTEL_CPU_CVT(BOOL, BOOL) +#define INTEL_CPU_CVT_FROM_BIN(DT) OV_CASE(Precision::DT, PrecisionInfo::value_type) + +#define INTEL_CPU_CVT_FROM_BIN_LIST \ + INTEL_CPU_CVT_FROM_BIN(FP32), INTEL_CPU_CVT_FROM_BIN(FP16), INTEL_CPU_CVT_FROM_BIN(BF16), \ + INTEL_CPU_CVT_FROM_BIN(FP64), INTEL_CPU_CVT_FROM_BIN(I16), INTEL_CPU_CVT_FROM_BIN(U8), \ + INTEL_CPU_CVT_FROM_BIN(I8), INTEL_CPU_CVT_FROM_BIN(U16), INTEL_CPU_CVT_FROM_BIN(I32), \ + INTEL_CPU_CVT_FROM_BIN(U32), INTEL_CPU_CVT_FROM_BIN(I64), INTEL_CPU_CVT_FROM_BIN(U64), \ + INTEL_CPU_CVT_FROM_BIN(BOOL) + +struct ConvertFromBinContext { + const void *srcPtr; + void *dstPtr; + size_t size; + bool converted; +}; + +template +struct ConvertFromBinPrecision { + void operator()(ConvertFromBinContext &ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); + const size_t nBits = 8; + const size_t nBytes = rnd_up(ctx.size, nBits); + parallel_for(nBytes, [&](size_t byteIndex) { + auto currentBitNum = std::min(nBits, ctx.size - byteIndex * nBits); + for (size_t bitIndex = 0; bitIndex < currentBitNum; ++bitIndex) { + dst[byteIndex * nBits + bitIndex] = static_cast((src[byteIndex] & (1 << bitIndex)) >> bitIndex); + } + }); + ctx.converted = true; + } +}; + + void cpu_convert(const void *srcPtr, void *dstPtr, Precision srcPrc, Precision dstPrc, const size_t size) { cpu_convert(srcPtr, dstPtr, srcPrc, dstPrc, dstPrc, size); } @@ -545,8 +579,22 @@ void cpu_convert(const void *srcPtr, } else { cpu_memcpy(dstPtr, srcPtr, size * dstPrc.size()); } + } else if (srcPrc == Precision::BIN) { + if (srcPrc.bitsSize() != 1) + IE_THROW() << "cpu_convert can't convert from: " << srcPrc << " precision to: " << dstPrc << ". Not implemented."; + ConvertFromBinContext ctx { + srcPtr, + dstPtr, + size, + false + }; + OV_SWITCH(intel_cpu, ConvertFromBinPrecision, ctx, dstPrc, INTEL_CPU_CVT_FROM_BIN_LIST); + if (!ctx.converted) + IE_THROW() << "cpu_convert can't convert from: " << srcPrc << " precision to: " << dstPrc; } else { - ConvertContext ctx = { + ConvertContext ctx { srcPtr, dstPtr, size,