fp16在cuda推力中的支撑
fp16 support in cuda thrust
我在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库。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- CUDA:统一内存和指针地址的更改
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 编译 CUDA 与数学函数的叮当
- 为什么 CUDA 不会导致C++代码加速?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- CUDA三角函数中的数学保证
- CUDA 使用共享内存平铺 3D 卷积实现
- CUDA:cudaMallocManage处理退出吗?
- Opencv 加速与 CUDA 在 C++.
- Cuda:具有位集数组的 XOR 单位集
- 用于构建 cuda .so 文件(共享库)的生成文件
- fp16在cuda推力中的支撑