首页 文章

如何使用全局纹理参考线程安全获取GPU内核(对于使用单个GPU的多个CPU线程)

提问于
浏览
0

当我们在多个CPU线程中并行运行某些GPU功能(例如,我们在多个位置使用纹理引用的点跟踪器)时,我们遇到了麻烦(所有CPU线程都使用相同的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 .

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

1 回答

  • 3

    纹理需要是全局对象,因此线程安全性与多线程共享的任何全局变量的关注方式相同 . 可能的解决方案也类似,您可以使用典型的并发结构来确保线程安全,否则将使用,例如,一个互斥锁,以确保只有一个线程绑定纹理,其他线程使用由此创建的引用 .

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

    但是,您应该考虑的是texture objects虽然仅在CC> = 3.0时受支持,但它们是not required to be globally declared .

    EDIT:
    NVIDIA工程师确认线程引用操作函数是线程安全的 .

相关问题