fp16在cuda推力中的支撑

fp16 support in cuda thrust

本文关键字:cuda fp16      更新时间:2023-10-16

我在thrust-cuda模板库中找不到任何关于fp16支持的信息。即使是路线图页面也没有任何内容:https://github.com/thrust/thrust/wiki/Roadmap

但我想可能有人已经想好了如何克服这个问题,因为fp16在cuda的支持已经超过6个月了。

到目前为止,我在代码中严重依赖推力,并对我使用的几乎每一个类进行模板化,以简化fp16的集成,不幸的是,即使是这个简单的示例代码:

//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-to-float的隐式转换。然而,在cuda中似乎存在允许显式转换的内部函数。

为什么我不能简单地重载cuda中某个头文件中的half和float构造函数,以添加以前的内部函数:

float::float( half a )
{
  return  __half2float( a ) ;
}
half::half( float a )
{
  return  __float2half( a ) ;
}

我的问题可能看起来很基本,但我不明白为什么我没有找到太多关于它的文档

提前感谢

很简单的答案是,您所寻找的并不存在。

稍微长一点的答案是,推力仅适用于基本型和POD型,CUDA fp16 half不是POD型。可能可以创建两个自定义类(一个用于主机,一个用于设备),实现所有所需的对象语义和算术运算符,以正确地使用推力,但这不是一项微不足道的工作(它需要编写或调整现有的FP16主机库)。

还要注意,当前的FP16支持仅在设备代码中,并且仅在计算5.3和更新的设备上。因此,除非你有Tegra TX1,否则你无论如何都不能在设备代码中使用FP16库。