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

时间:2013-10-29 15:23:41

标签: multithreading cuda

当我们在多个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 个答案:

答案 0 :(得分:3)

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

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

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

修改
NVIDIA工程师确认线程引用操作函数是线程安全的。