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 库。