我正在尝试使用 bfloat16 作为在 HPC 集群上工作的应用程序的格式。为此,我安装了 g++13,它据说支持 bfloat16 格式,但这对我来说并不一致。 在我的本地计算机上,它可以工作并支持 std::float16_t 以及 std::bfloat16_t 但在两个不同的集群上,这些不受支持。 预定义的宏也不存在,这对我来说似乎意味着这些不受实现的支持。 所有三台计算机都具有相同的微体系结构 x86_64,并且我的本地计算机和两个集群中的至少一个之间的安装不应有差异。另一方面,gcc-13 作为模块预安装。 什么定义了 bfloat16 是否可用以及是否有某种方法可以使用它? 不幸的是,在所有三台机器上都可用的 __Float16 没有提供足够的指数位,因此无法满足我的目的。 或者,如果这无法解决,是否有任何库添加对 bfloat16 的支持?我只能找到 IEEE fp16 的库。
我已经在其中两台机器上手动安装了 g++13,它可以在两台机器上运行,但不能在另一台机器上运行,并且我无法在 gcc 文档中找到此问题的原因。我能想到的唯一原因是因为机器具有不同的架构,但命令 uname -m 对于所有这三个机器都返回 x86_64,所以至少这三个机器的微架构是相同的。
这里有一些代码用于测试 bfloat16_t 在系统上的可用性并检查与 float16_t 的性能差异。
#include <stdfloat>
#include <ctime>
#include <iostream>
using namespace std;
#if __STDCPP_FLOAT16_T__ != 1
#error "16-bit standard float type required"
#endif
#if __STDCPP_BFLOAT16_T__ != 1
#error "16-bit bfloat type required"
#endif
int main()
{
float16_t f = 0.1f16;
bfloat16_t bf = 0.1bf16;
long n = 40000000000;
int start_s=clock();
for (long i = 0; i < n; i++) {
float16_t t = f * f * f * f;
float16_t r = t;
}
int stop_s=clock();
cout << "time: "<< (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 <<" to calculate in float16" << endl;
start_s=clock();
for (long i = 0; i < n; i++) {
bfloat16_t tb = bf * bf * bf * bf;
bfloat16_t rb = tb;
}
stop_s=clock();
cout << "time: "<< (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 <<" to calculate in bfloat16" << endl;
return 0;
}