0

当我们在多个 CPU 线程(所有 CPU 线程使用同一个 GPU)中并行运行某些 GPU 功能(例如,我们在多个位置使用纹理引用的点跟踪器)时,我们遇到了麻烦。

似乎“纹理引用”(afaik 是一种“全局设备变量”)是问题所在,因为这些是我们拥有的唯一“全局”变量(注意“恒定内存”可能也是一个问题,但我们将重点关注现在关于纹理参考问题)。正如我们在图像处理领域中一样,我们主要使用对 2D 图像(倾斜线性存储器)的纹理引用。

我们如何重写使用纹理引用的内核,使它们是 CPU 线程安全的?有可能吗?请注意,在我们的框架中,我们计划为每个 GPU 提供恰好 4 个 CPU 线程(每个 CPU 线程都是一个 GPU-Worker-Thread,它会获得一些“GPU 作业”,然后他会执行)。

这个问题似乎与“纹理引用数组”的问题有关,我不知道现在使用更新的 Cuda Toolkit/更新的 GPU 架构是否可以使用纹理引用数组。请参阅论坛帖子

https://devtalk.nvidia.com/default/topic/376700/?comment=2688621

https://devtalk.nvidia.com/default/topic/368336/cuda-programming-and-performance/-help-compilation-problem-with-cuda-texture-cuda-texture-usage/

或者只是在 nvidia cuda 论坛中搜索“纹理引用数组”并注意这似乎是一个非常热门的话题 :-)

在其中一个帖子中提到了一个函数“cuTexRefCreate”,这是要走的路吗?我想它也可以在 cuda 运行时 api 中使用。但它似乎已被弃用,因此这可能不是一种安全的方式。

对此问题的任何帮助将不胜感激。请注意,任何可能的策略也应该适用于 Fermi 架构 GPU。

一个相关的问题是这个多线程问题是否也是最新开普勒架构的问题,其中类型为“const __restrict”的指针可能会自动映射到纹理对象。

4

1 回答 1

4

纹理需要是全局对象,因此线程安全是一个问题,就像它与多个线程共享的任何全局变量一样。可能的解决方案也相似,您可以使用典型的并发构造来确保线程安全,就像您在其他情况下使用的那样,例如互斥锁以确保只有一个线程绑定纹理,而其他线程使用由此创建的引用。

我不完全确定的是纹理引用操作函数本身是否是线程安全的,即是否需要确保纹理操作不会在同一个引用上同时发生。

但是,您真正应该考虑的是纹理对象,尽管仅在 CC >=3.0 上受支持,但它们不需要全局声明

编辑:
NVIDIA 工程师确认线程引用操作函数是线程安全的。

于 2013-10-30T18:24:19.897 回答