【发布时间】:2016-03-11 10:20:53
【问题描述】:
我有一个应用程序,其中 96% 的时间用于 3D 纹理内存插值读取(图中的红点)。
我的内核设计为在任意穿过纹理内存的行上进行 1000 次内存读取,每行一个线程(蓝线)。这些线路密密麻麻,彼此非常接近,几乎平行移动。
图片显示了我所说的概念。想象图像是来自 3D 纹理内存的单个“切片”,例如z=24。对所有z 重复该图像。
目前,我只在一行之后执行线程,但我意识到如果我在同一块中调用相邻行,我可能能够从纹理内存局部性中受益,从而减少内存读取时间。
我的问题是
如果我有带线性插值的 3D 纹理,我怎样才能从数据局部性中获益最多?通过在 2D 中运行同一块中的相邻线或在 3D 中运行相邻线(3D 邻居或每个切片的邻居)?
缓存有多大(或者我如何在规范中检查)?它是否加载例如问的体素和各个方向的+-50?这将与我在每个块中放置的相邻行的数量直接相关!
插值如何应用于纹理内存缓存?插值是否也在缓存中执行,或者它的插值将减少内存延迟,因为它需要在文本内存本身中完成?
在 NVIDIA TESLA K40、CUDA 7.5 上工作,如果有帮助的话。
【问题讨论】:
-
这听起来确实是一个最好使用基准测试解决的问题。我不相信您感兴趣的任何信息都是公开的,除了缓存大小。
-
@talonmies 我看到了。不过,这是一个合理的答案。我花了几个小时试图找到信息,我想我不是唯一一个。
-
只有基准测试才能说明问题。但根据我的经验,绝对值得尝试同时推进所有“线路”并一起查询靠近的位置。
-
问一个有点“酸甜苦辣”的问题——这已经快一年了。你有没有得出任何结论?您是否可以根据您为 TIGRE 工具箱编写的代码的基准测试/测试添加一个摘要答案?
-
谢谢你这样做,我认为有一个部分答案总比没有好
标签: cuda