DAY46:阅读Surface Reference API

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第46天,我们正在讲解CUDA C语法,希望在接下来的54天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。

B.9.2. Surface Reference API

B.9.2.1. surf1Dread()

reads the CUDA array bound to the one-dimensional surface reference surfRef using coordinate x.

B.9.2.2. surf1Dwrite

writes value data to the CUDA array bound to the one-dimensional surface reference surfRef at coordinate x.

B.9.2.3. surf2Dread()

reads the CUDA array bound to the two-dimensional surface reference surfRef using coordinates x and y.

B.9.2.4. surf2Dwrite()

writes value data to the CUDA array bound to the two-dimensional surface reference surfRef at coordinate x and y.

B.9.2.5. surf3Dread()

reads the CUDA array bound to the three-dimensional surface reference surfRef using coordinates x, y, and z.

B.9.2.6. surf3Dwrite()

writes value data to the CUDA array bound to the three-dimensional surface reference surfRef at coordinate x, y, and z.

B.9.2.7. surf1DLayeredread()

reads the CUDA array bound to the one-dimensional layered surface reference surfRef using coordinate x and index layer.

B.9.2.8. surf1DLayeredwrite()

writes value data to the CUDA array bound to the two-dimensional layered surface reference surfRef at coordinate x and index layer.

B.9.2.9. surf2DLayeredread()

reads the CUDA array bound to the two-dimensional layered surface reference surfRef using coordinate x and y, and index layer.

B.9.2.10. surf2DLayeredwrite()

writes value data to the CUDA array bound to the one-dimensional layered surface reference surfRef at coordinate x and y, and index layer.

B.9.2.11. surfCubemapread()

reads the CUDA array bound to the cubemap surface reference surfRef using coordinate x and y, and face index face.

B.9.2.12. surfCubemapwrite()

writes value data to the CUDA array bound to the cubemap reference surfRef at coordinate x and y, and face index face.

B.9.2.13. surfCubemapLayeredread()

reads the CUDA array bound to the cubemap layered surface reference surfRef using coordinate x and y, and index layerFace.

B.9.2.14. surfCubemapLayeredwrite()

writes value data to the CUDA array bound to the cubemap layered reference surfRef at coordinate x and y, and index layerFace.

本文备注/经验分享:

surface也像texture那样, 分为surface reference和object(DAY45:阅读Surface Object API), 但是surface不同的是, surface reference出现的晚, 是在2.0时期才出来的,也就是Fermi(还记得它么) ,跟随当时的CUDA 3.2这个版本一样.这个版本的CUDA引入了v2版本的api, 很多函数发生了变化.相当大致今天的CUDA 9的样子. 而CUDA 3.2之前, CUDA 3.2 - 9.0, cuda9+,基本上可以看成3段会引发程序兼容性问题的3个大阶段. 主要注意一下.中间的很久是基本上很平稳的过渡(3.2到9.0), 但是很快surface reference出来后不久, 到了3.0的Kepler时代, 就开始有了Surface Object了。两者主要是使用方便性上的变化对用户来说. 基本一样的. 和texture对比, Surface主要贡献了两点作用: (1) surface的后备存储的cuda array, 是可以写入的, 这解决了长期以来, 使用cuda array做为后备存储, 需要更新内容时候带来的, 必须走host进行cudaMemcpy*的繁琐.现在kernel直接通过surface在device上进行细粒度的内容改写了. (2) 做为一个简化版本的texture使用,很多人需要使用texture的cache性能(例如在配合cuda array的时候, 利用内部特殊的元素排列取得的空间上的效果), 而不需要复杂的采样器功能(例如线性插值之类的),此时可以直接使用surface.所以本章节你看到了很多函数的有很多细微的和texture的不同.例如边界模式上, 可以直接在调用的时候做为最后一个参数指定.例如这里的越界读取返回0的模式.请注意这里因为是surface, 还可以写入,所以还多了对此模式的越界写入的时候将被自动忽略的说明(texture不能写入)。 虽然本章节很长, 但大部分的内容都和texture类似.阅读的人看到函数说明后, 应当毫无压力的理解.但有几个地方需要说明: (1)surface的坐标采用字节单位, 而texture使用元素单位.精确的说, 只有第一个坐标(x坐标这样),用户往往需要进行元素和字节上的单位变换, 往往可以直接通过sizeof(元素)这个系数的乘法. 基本上surface没啥可说的. 一样的.注意单位(x方向)是字节, 特别要改写使用常规坐标(非归一化坐标)的texture代码的时候. 其他好像没啥可说了. (2)更新了Surface后, 如果还要有读取(包括surface或者使用了同一后备的cuda array的texture), 必须下个kernel生效.直接在本kernel内部读取将导致未定义的结果. (3)这同样对使用了普通线性内存(显存)的texture有用.没有surface之前, 很多人选择使用普通后备存储的texture, 然后用普通指针进行写入改写.此时也依然需要下次启动kernel生效.因为下次kernel启动的时候,将自动进行清理texture cache, L1 cache之类的操作.能确保安全.

有不明白的地方,请在本文后留言

或者在我们的技术论坛bbs.gpuworld.cn上发帖

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

原文发表时间:2018-07-11

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Fish

CUDA C最佳实践-CUDA Best Practices(三)

10. 运行配置优化 10.1. 占用 10.1.1. 计算占用 10.2. 同步Kernel执行 10.3. 多上下文 10.4. 隐藏寄存器依赖 10.5....

23910
来自专栏逸鹏说道

Toxy新手教程

Toxy新手教程 官方网站:http://toxy.codeplex.com Toxy是干嘛用的?它是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问...

2906
来自专栏Python中文社区

Python量子力学计算模拟以及数据可视化

專 欄 ❈Pytlab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,...

7609
来自专栏Crossin的编程教室

【每周一坑】螺旋矩阵

今天这题,看起来挺简单,实际写出来并不容易。在以前公司我曾把它做过招聘的笔试题,结果惨不忍睹,不得不拿掉。 输出如图的螺旋矩阵: 1 2 3 4...

3637
来自专栏吉浦迅科技

在cuda的核函数中可以按地址调用普通变量么?

请问在cuda的核函数中可以按地址调用普通变量么? GPU世界论坛 bbs.gpuworld.cn Hi, 楼主, 完全无问题,从Fermi起引入卡内统...

3777
来自专栏飞雪无情的博客

Go语言实战笔记(二十二)| Go 基准测试

基准测试,是一种测试代码性能的方法,比如你有多种不同的方案,都可以解决问题,那么到底是那种方案性能更好呢?这时候基准测试就派上用场了。

1133
来自专栏人工智能LeadAI

配置深度学习主机与环境(TensorFlow+1080Ti) | 第三章 CUDA与CUDNN安装

01 概念介绍 CUDA(Compute Unified Device Architecture 统一计算设备架构) CUDA(Compute Unified ...

4587
来自专栏吉浦迅科技

DAY5:阅读 CUDA C编程接口之CUDA C runtime

1334
来自专栏轮子工厂

教你用翻译软件快速阅读大量英文文献

对于一些引用的英文文献,我们需要快速地了解整篇文献讲了什么内容,来判断是否可以作为“国内外研究现状”来进行详细分析。

1804
来自专栏生信技能树

转录组数据拼接之应用篇

前前后后接触了一些基因组和转录组拼接的工作,而且后期还会持续进行。期间遇到了各种各样莫名其妙的坑,也尝试了一些不同的方法和软件,简单做一个阶段性小结。上周的今天...

5526

扫码关注云+社区

领取腾讯云代金券