【发布时间】:2016-07-11 20:17:16
【问题描述】:
我在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 ) ;
}
我的问题可能看起来很基本,但我不明白为什么我没有找到很多关于它的文档。
提前谢谢你
【问题讨论】:
-
第二个(真正独立的)问题很简单——内在(即非类)类型没有构造函数。您不能专门为
float使用构造函数,因为根据定义,float 没有构造函数。见stackoverflow.com/questions/5113365/… -
好的,基本上,不允许开发人员定义内在类型之间的“隐式”转换。但是,除了构建自己的 cuda 编译器之外,它不是给编译器一个提示的另一种方式吗?
-
抱歉,我对第二句话一无所知。
-
抱歉我的英语不好,我在问除了重写我自己的 cuda 编译器之外是否还有其他解决方案。您的下一个答案或多或少符合我的预期。
-
这是我正在研究的东西(我在 NVIDIA 维护 Thrust)