我无法在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 ) ;
}
我的问题可能看起来很基本,但我不明白为什么我找不到有关它的文档。
提前谢谢
答案 0 :(得分:2)
非常简短的回答是,你所寻找的东西并不存在。
稍长一点的答案是推力仅适用于fundamental和POD类型,而CUDA fp16 half
不是POD类型。它可能可以创建两个自定义类(一个用于主机,一个用于设备),它实现了所有必需的对象语义和算术运算符,可以正确地使用推力,但它不是一个微不足道的努力做到这一点(并且需要编写或调整现有的FP16主机库)。
另请注意,当前的FP16支持仅适用于设备代码,仅适用于计算5.3和更新的设备。因此,除非你有Tegra TX1,否则你无法在设备代码中使用FP16库。