上海柘中建设股份有限公司网站,cms系统介绍,在线简易网页制作网站,wordpress 会员支付宝背景#xff1a;
最近用到一块推理加速卡时#xff0c;推理输入的数据是 float16 类型#xff0c;而我们平常用到的数据是 float 类型#xff0c;也就是 float32类型#xff0c;这需要输入数据时float32 转 float16#xff0c;解析输出数据时 float16 转 float。
参考
最近用到一块推理加速卡时推理输入的数据是 float16 类型而我们平常用到的数据是 float 类型也就是 float32类型这需要输入数据时float32 转 float16解析输出数据时 float16 转 float。
参考
彻底搞懂float16与float32的计算方式float32转float16
正文 方式一 CPU平台ARM 操作系统Ubuntu 20.04 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(cpp)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_SYSTEM_NAME Linux)SET(CMAKE_CXX_FLAGS_DEBUG $ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb -Wno-dev)
SET(CMAKE_BUILD_TYPE Release)
#add_compile_options(-W)add_executable(test_arm test_arm.cpp)test_arm.cpp
#include iostream
#include arm_neon.hint main()
{// float32 -- float16float f32 3.14159265358979323846f;unsigned short f16;float32x4_t tmp vld1q_dup_f32(f32);float16_t res vget_lane_f16(vcvt_f16_f32(tmp), 0);f16 *reinterpret_castuint16_t*(res);std::cout f32 std::endl;std::cout f16 std::endl;// float16 -- float32float f321;float16_t tmp1 *reinterpret_castfloat16_t*(f16);float32x4_t res1 vcvt_f32_f16(vld1_dup_f16(tmp1));vst1q_lane_f32(f321, res1, 0);std::cout f321 std::endl;return 0;
}打印结果
3.14159
16968
3.14062上面 float32 -- float16 代码中通过 vld1q_dup_f32 函数将 f32 中的值复制到一个四元素向量 tmp 中。然后使用 vcvt_f16_f32 函数将 tmp 中的值转换为一个16位浮点数并使用 vget_lane_f16 函数从该浮点数中取出第 0 个元素作为结果。最后它使用 reinterpret_cast 将结果转换为一个16位无符号短整型并将其存储到 f16 中。
float16 -- float32代码中使用 reinterpret_cast 将 f16 转换为一个16位浮点数变量tmp。接着使用 vld1_dup_f16 函数将 tmp 中的值装载到一个四元素向量中并使用vcvt_f32_f16 函数将该向量中的16位浮点数值转换为32位浮点数。最后使用vst1q_lane_f32将结果写回 f321 变量。