cpu16对cuda推力的支持

时间:2016-03-24 09:27:15

标签: c++ cuda thrust

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

但我认为有人可能已经想出如何克服这个问题,因为cuda的fp16支持已经超过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到float。但是,似乎cuda中有intrinsics允许显式转换。

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

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

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

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

提前谢谢

1 个答案:

答案 0 :(得分:2)

非常简短的回答是,你所寻找的东西并不存在。

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

另请注意,当前的FP16支持仅适用于设备代码,仅适用于计算5.3和更新的设备。因此,除非你有Tegra TX1,否则你无法在设备代码中使用FP16库。