【问题笔记】在NVIDIA Tesla V100上用非tensor core测试,半精度并不如单精度,是真的么?

有同学问:NVIDIA手册上说Tesla P100用sp做半精度,理论计算能力是单精度的一倍,我在Tesla V100上用非tensor core测试,半精度并不如单精度。不知道是p100是不是也这样?

对于这个问题我们好好唠唠:

备注/经验分享:

Tesla V100的半精度有两部分。 一部分是通用的,另外一部分是专用的。 通用的是SP,用户可以自行写代码进行任何涉及半精度的数据类型的运算。专用的是Tensor Core,只能进行矩阵乘法(图灵也是这样)。而在使用通用的半精度的时候,必须使用打包类型(2个half在一起)进行2个2个的运算。

这种才能100%。

NV有过文章:

The half type is used to represent FP16 values on the device. As with Kepler and Maxwell, FP16 storage can be used to reduce the required memory footprint and bandwidth compared to FP32 or FP64 storage. Pascal also adds support for native FP16 instructions. Peak FP16 throughput is attained by using a paired operation to perform two FP16 instructions per core simultaneously. To be eligible for the paired operation the operands must be stored in a half2 vector type. GP100 and GP104 provide different FP16 throughputs. GP100, designed with training deep neural networks in mind, provides FP16 throughput up to 2x that of FP32 arithmetic.

这段是CUDA自带的文章的。必须使用half2类型进行运算才能双倍。这是其一(这段来自Pascal的Tuning Guide。GP100只有通用的200%的FP16)

这里是CUDA 8当初的介绍,如何使用half2类型,请注意,和常规的直接使用加号(+)之类的运算不同,half2类型需要很多的intrinsic functions。

请用户直接参考此文,和打开cuda_fp16.h进行观察。需要注意的是,CUDA 9.2的这里稍微有些改变,但是改变不大。打开该头文件自己看即可(在你的CUDA 9.2的安装目录),注意。因为GP100这种卡,以及GV100和后续的图灵的通用计算,当使用FP16的时候必须2个一起上。如果用户只是用了1个half类型,会等于舍弃掉另外一半的计算性能。只有50%的200%的性能。也就是此时性能将和普通float一样(甚至一定条件下会不如普通float),为何?因为还有pack/unpack成本。所以建议在通用计算的时候,总是使用half2类型。

需要注意的是,如果能利用库建议利用,cublas之类的很多计算可以上半精度的。

大家也可以参考我们在论坛上的一个帖子:

一个寄存器能不能被两个half占用,比如__half a[2]={0, 0}是不是占一个寄存器 (点击阅读原文,访问这个帖子)

原文发布于微信公众号 - 吉浦迅科技(gpusolution)

原文发表时间:2018-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习那些事儿

浅谈Pytorch与Torch的关系

Pytorch发布已经有一段时间了,我们在使用中也发现了其独特的动态图设计,让我们可以高效地进行神经网络的构造、实现我们的想法。那么Pytorch是怎么来的,追...

8.9K8
来自专栏计算机视觉与深度学习基础

模拟猜单词游戏

模拟实现猜单词游戏,纯模拟,不涉及图形界面,注释很详细,虽然本人代码写得丑,但是希望可以给大家提供帮助 #include<algorithm> #include...

20110
来自专栏IT可乐

深入理解计算机系统(5.1)------优化程序性能

  你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候。   在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都...

23410
来自专栏追不上乌龟的兔子

使用Python标准库functools中的lru_cache实现缓存

很简单,也很容易理解,但是不难发现这个函数在计算斐波那契数列的时候事实上进行了很多重复计算,例如:

1794
来自专栏用户2442861的专栏

教你如何迅速秒杀掉:99%的海量数据处理面试题

   一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿...

1362
来自专栏编程

Python进阶系列连载(7)——生成器(下)

作者:王大伟 Python爱好者社区唯一小编 博客:https://ask.hellobi.com/blog/wangdawei 如果还没看过我的入门连载部分,...

1967
来自专栏数据结构与算法

BZOJ1228: [SDOI2009]E&D(打表SG)

Description 小E 与小W 进行一项名为“E&D”游戏。游戏的规则如下:桌子上有2n 堆石子,编号为1..2n。其中,为了方便起见,我们将第2k-1...

3095
来自专栏数据结构与算法

洛谷P2704 [NOI2001]炮兵阵地(状压dp)

司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示)...

632
来自专栏栗霖积跬步之旅

一天一个设计模式:策略模式

策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响客户端的情...

1042
来自专栏IMWeb前端团队

网络序?本地序?傻傻分不清楚。。。

网络序?本地序?傻傻分不清楚。。。 这个问题源于最近做的一个项目,需要用Node.js进行socket网络编程,涉及到使用TCP/UDP通过自定义的二进制数据序...

20010

扫码关注云+社区

领取腾讯云代金券