nvcc,gcc,clang和msvc"尊重"结构中的__restrict__关键字?

时间:2016-04-15 19:59:35

标签: c++ memory struct cuda restrict

假设我有

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 ++当前版本的答案也很有趣。

2 个答案:

答案 0 :(得分:2)

GCC似乎表示肯定,但我认为,在这些类型的事情中,他们都很聪明,可能会完全忽略关键字存在的事实。

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

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

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

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

现在我对分析代码的结果非常好奇。

答案 1 :(得分:0)

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

<script> //turn entire div into toggle function toggle_visibility(id) { var e = document.getElementById(id); if (e.style.display == 'block' || e.style.display == '') e.style.display = 'none'; else e.style.display = 'block'; } </script> 关于结构成员的指针是officially unsupported(强调我的):

  

不允许以下内容:

     
      
  • 递归。
  •   
  • 使用volatile关键字声明的变量。
  •   
  • 虚拟功能。
  •   
  • 指示功能。
  •   
  • 指向会员功能的指针。
  •   
  • 结构中的指针。
  •   
  • 指针指针。
  •   
  • 转到声明。
  •   
  • 标签声明。
  •   
  • 尝试,捕捉或抛出陈述。
  •   
  • 全局变量。
  •   
  • 静态变量。请改用tile_static关键字。
  •   
  • dynamic_cast演员。
  •   
  • typeid运算符。
  •   
  • asm声明。
  •   
  • 可变参数。
  •   

Microsoft Visual C ++ 2015

一般而不是AMP C ++代码,它是MSVC支持的much less clear。我们在__restrict__声明中看到了__restrict__的一个例子 - 所以不仅仅是对函数的paremeter进行了修改 - 但是在{{1}中使用的语义不同}。