【发布时间】: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