如何将 __restrict__ 与 __constant__ 指针指向的数组组合?

How to combine __restrict__ with an array pointed to by a __constant__ pointer?

我认为这是一个有点古怪的问题,如果我需要详细说明,请说明。

情况如下:我有大约 2 GB 的 GPU 内存包含我的随机数,我需要在许多不同的函数中使用它们。为了防止从设备函数到设备函数传递指向该内存的指针(并且重复多次),我将指针放在 gpu 常量内存中,这也为我节省了寄存器(对我来说非常重要)。现在我知道,如果通过使用关键字 __restrict__ 解释函数的参数指向的内存块是非重叠的,那么在某些情况下可以加快函数的速度。

问题:我如何确保编译器知道常量内存中的指针所指向的全局内存中的内存块是不重叠的(也许也很高兴知道:在生成随机数后永远不会改变内核调用)?

我不知道有什么方法可以为编译器提供对其他匿名指针的试探法。

如果您可以管理它,尝试帮助编译器完成其工作的最简单方法是将指针作为 __restrict__ 修饰的内核参数传递,然后强制内联设备函数。这将绕过 ABI,并可能允许编译器利用已知的非别名条件来优化内存访问模式。它还应该有助于您的函数的寄存器足迹。我不确定 __restrict____device__ 函数或 __constant__ 声明有多大影响,但你已经注意到编译器接受它,所以我想它不会伤害到最少尝试。

我期待 NVIDIA 的一位工具链或优化专家就引擎盖下可能发生的事情以及在这种情况下可能有用的其他技巧发表评论。