【问题标题】:Do nvcc, gcc, clang and msvc "respect" the __restrict__ keyword within structs?nvcc、gcc、clang 和 msvc 是否“尊重”结构中的 __restrict__ 关键字?
【发布时间】:2016-08-07 22:34:18
【问题描述】:

假设我有

struct s {
    int* __restrict__ p1;
    double v;
};

void foo(int* __restrict__ p2, struct s my_s) { /* ... */ }

在这种情况下,下面列出的 C++ 编译器是否尊重 __restrict__ 关键字,并假设通过 p2 的内存访问不会影响通过 p1 的访问?显然这是依赖于编译器的,因为restrict 不是 C++ 关键字。

我主要对 gcc 4.9.x 和 nVIDIA CUDA 7.5 的 nvcc 的答案感兴趣(当然是在编译设备代码时,而不是在转发到主机编译器时)。关于当前版本的 clang、gcc 和 msvc++ 的答案也会很有趣。

【问题讨论】:

  • 这是一个非常晦涩难懂的东西。您要解决的问题是什么?
  • restrict 关键字是 C 构造,而不是 C++ 构造,因此实际上是编译器是否愿意支持它的问题。
  • 如果我正在编写主机代码,我会使用特定主机 C++ 编译器支持的任何限制语法。对于 CUDA 设备代码,我会使用__restrict__(不是__restrict)关键字,即documented。如果您需要将两者互换用于主机/设备使用,我会使用类似于 __host__ __device__ 的常用替换宏。
  • 每一个?每时每刻?可能不是?你为什么不发布一个可以回答的问题。
  • 编译器在某些情况下可能会选择“尊重”它而不是其他情况。我显然不是在暗示它是基于随机化器的。也许你应该“考虑写更好的问题”。别忘了,你是想获得免费帮助的人。

标签: c++ memory struct cuda restrict


【解决方案1】:

GCC 似乎表明是的,但我想在幕后它对这些类型的事情都很聪明,可能会完全忽略关键字存在的事实。

我也愿意打赌,如果您使用和不使用限制关键字来描述您的方法,那么几乎没有区别。

如果你这样做,我很想知道结果。

还有this 的答案可能会很有趣。

最后,有this的博客,似乎表明nvcc支持该关键字。

现在我真的很好奇分析您的代码的结果。

【讨论】:

  • 我认为您链接到的任何地方实际上建议 __restrict__ 在应用于结构/类成员时都不会受到尊重,只是一般都支持它。我可能会花时间检查编译的代码。
【解决方案2】:

Microsoft C++ AMP(使用 MSVC++ 2015)

__restrict__ 在结构成员指针上是 officially unsupported(强调我的):

以下是不允许的:

  • 递归。
  • 使用 volatile 关键字声明的变量。
  • 虚拟函数。
  • 指向函数的指针。
  • 指向成员函数的指针。
  • 结构中的指针。
  • 指向指针的指针。
  • goto 语句。
  • 带标签的语句。
  • try、catch 或 throw 语句。
  • 全局变量。
  • 静态变量。请改用 tile_static 关键字。
  • dynamic_cast 强制转换。
  • typeid 运算符。
  • asm 声明。
  • 可变参数。

微软 Visual C++ 2015

一般来说,MSVC 支持的是much less clear,而不是 AMP C++ 代码。我们看到__restrict__union 声明中使用的示例 - 因此不仅仅是对函数参数的修改 - 但语义与在struct 中使用的语义不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2013-07-10
    相关资源
    最近更新 更多