cuda推力中的fp16支持
fp16 support in cuda thrust
我在 thrust cuda 模板库中找不到任何关于 fp16 支持的信息。
甚至路线图页面也没有任何内容:
https://github.com/thrust/thrust/wiki/Roadmap
但我认为有人可能已经想出如何解决这个问题,因为 cuda 中的 fp16 支持已经存在了 6 个多月。
截至今天,我在我的代码中严重依赖推力,并且几乎对我使用的每个 class 进行模板化以简化 fp16 集成,不幸的是,即使这样,对于 half type 也绝对没有开箱即用的方法简单示例代码:
//STL
#include <iostream>
#include <cstdlib>
//Cuda
#include <cuda_runtime_api.h>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <cuda_fp16.h>
#define T half //work when float is used
int main(int argc, char* argv[])
{
thrust::device_vector<T> a(10,1.0f);
float t = thrust::reduce( a.cbegin(),a.cend(),(float)0);
std::cout<<"test = "<<t<<std::endl;
return EXIT_SUCCESS;
}
此代码无法编译,因为似乎没有从 float 到 half 或 half 到 float 的隐式转换。但是,cuda中似乎有intrinsics允许显式转换。
为什么我不能简单地在 cuda 的某个头文件中重载 half 和 float 构造函数,以添加以前的内在函数:
float::float( half a )
{
return __half2float( a ) ;
}
half::half( float a )
{
return __float2half( a ) ;
}
我的问题可能看起来很基础,但我不明白为什么我没有找到很多关于它的文档。
提前致谢
非常简短的回答是您要查找的内容不存在。
稍微长一点的答案是,thrust 仅适用于 fundamental and POD 类型,而 CUDA fp16 half
不是 POD 类型。它 可能 可以制作两个自定义的 类(一个用于主机,一个用于设备)实现所有必需的对象语义和算术运算符以正确处理推力,但这不是一项微不足道的工作(并且需要编写或改编现有的 FP16 主机库)。
另请注意,当前的 FP16 支持仅存在于设备代码中,并且仅适用于计算 5.3 和更新的设备。所以除非你有 Tegra TX1,否则你不能在设备代码中使用 FP16 库。
我在 thrust cuda 模板库中找不到任何关于 fp16 支持的信息。 甚至路线图页面也没有任何内容: https://github.com/thrust/thrust/wiki/Roadmap
但我认为有人可能已经想出如何解决这个问题,因为 cuda 中的 fp16 支持已经存在了 6 个多月。
截至今天,我在我的代码中严重依赖推力,并且几乎对我使用的每个 class 进行模板化以简化 fp16 集成,不幸的是,即使这样,对于 half type 也绝对没有开箱即用的方法简单示例代码:
//STL
#include <iostream>
#include <cstdlib>
//Cuda
#include <cuda_runtime_api.h>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>
#include <cuda_fp16.h>
#define T half //work when float is used
int main(int argc, char* argv[])
{
thrust::device_vector<T> a(10,1.0f);
float t = thrust::reduce( a.cbegin(),a.cend(),(float)0);
std::cout<<"test = "<<t<<std::endl;
return EXIT_SUCCESS;
}
此代码无法编译,因为似乎没有从 float 到 half 或 half 到 float 的隐式转换。但是,cuda中似乎有intrinsics允许显式转换。
为什么我不能简单地在 cuda 的某个头文件中重载 half 和 float 构造函数,以添加以前的内在函数:
float::float( half a )
{
return __half2float( a ) ;
}
half::half( float a )
{
return __float2half( a ) ;
}
我的问题可能看起来很基础,但我不明白为什么我没有找到很多关于它的文档。
提前致谢
非常简短的回答是您要查找的内容不存在。
稍微长一点的答案是,thrust 仅适用于 fundamental and POD 类型,而 CUDA fp16 half
不是 POD 类型。它 可能 可以制作两个自定义的 类(一个用于主机,一个用于设备)实现所有必需的对象语义和算术运算符以正确处理推力,但这不是一项微不足道的工作(并且需要编写或改编现有的 FP16 主机库)。
另请注意,当前的 FP16 支持仅存在于设备代码中,并且仅适用于计算 5.3 和更新的设备。所以除非你有 Tegra TX1,否则你不能在设备代码中使用 FP16 库。