CUDA Pro Tip: Optimize for Pointer Aliasing
devblogs.nvidia.com
devblogs.nvidia.com
"By giving a pointer the restrict property, the programmer is promising the compiler that any data accessed through that pointer is not accessed in any other way. In other words, the compiler doesn’t have to worry about aliasing when using a pointer with the restrict property."
This is false. Entirely. Believing it will get you into trouble.
restrict is, as written in at least C99 and C11 (It's not in C++03 or C++11 standard, though compilers have imported the semantics from C99 to there to allow its use), is completely broken, in the sense that it doesn't do what you want (say two pointers can't alias).
This is being fixed in C++ (though no plans to fix in C), but as a completely trivial example:
void example1(restrict float *a, restrict float *b, float *c, int i) {
c[i] = a[i] + b[i];
}
In this example, a and b may alias, despite the restrict, because restrict says the storage must be modified:"During each execution of B, let L be any lvalue that has &L based on P. If L is used to access the value of the object X that it designates, and X is also modified (by any means), then the following requirements apply"
(the standard then gives the above as an example of how two pointers may be aliased with restrict)
When could one get into trouble thinking that "restrict == this will not alias"? If X is never modified during B it seems like aliasing wouldn't cause any problems.
Since restrict means nothing if no value in it is modified, would it be reasonable and possible for the compiler to issue a warning in cases like example1?
IE you will get into performance trouble :)
In general, there are some complicated scope related cases where you will get into trouble (the rules deal with "based on" and "scope" all over the place, and not in ways that always make sense).
I don't see how one could get into trouble as a developer though. It seems to me that, while technically incorrect, the blog imposes more restrictions than is actually neccessary on the user.
No, it doesn't :) It forbids some forms of type casting if they are later dereferenced, but that's not really the same.
to achieve this, try using the __constant address space.
However, the general analysis you are looking for is known as "points-to analysis".
It is a very large and complicated topic. Happy to try to answer anything more specific though.
If you choose to pass arguments that do alias to a function, that becomes your problem.