【问题标题】:fp16 support in cuda thrustcuda 推力中的 fp16 支持
【发布时间】: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)

标签: c++ cuda thrust


【解决方案1】:

非常简短的回答是,您要查找的内容不存在。

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

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

【讨论】:

  • 实际上我可以在设备代码中使用它来进行类似加载/存储的操作,仅此而已。显然,我只是简单地为我的应用程序键入模板并希望在添加 cuda fp16 支持时自动提高性能。
  • @Tobbey:我不会说这是愚蠢的,只是为时过早。对 FP16 的支持很可能会在未来出现,但它需要比现在可用的更精细的语义支持。鉴于下一代硬件将提供完整的半精度硬件支持,我猜它最终会到来。只是还没有。
  • 好的,感谢您正确看待问题。我还将为解释 c++11 中琐碎和标准布局的链接提供 +1,非常有趣!
猜你喜欢
  • 2014-07-01
  • 2017-02-14
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2016-09-02
  • 1970-01-01
相关资源
最近更新 更多