Уважают ли nvcc, gcc, clang и msvc ключевое слово __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 и nvcc nVIDIA CUDA 7.5 (конечно, при компиляции кода устройства, а не при пересылке на главный компилятор). Ответ относительно текущих версий clang, gcc и msvC++ также будет интересен.
2 ответа
Похоже, что GCC указывает "да", но я мог бы предположить, что все эти умные мысли не имеют смысла и могут полностью игнорировать тот факт, что ключевое слово присутствует.
Я также был бы готов поспорить, что если вы профилируете свой метод с использованием и без использования ключевых слов с ограничениями, между ними не будет никакой разницы.
Если вы сделаете это, я бы хотел узнать результаты.
Там также есть этот ответ, который может быть интересно прочитать.
Наконец, есть этот блог, который, кажется, указывает, что nvcc поддерживает ключевое слово.
Теперь мне действительно интересно узнать о результатах профилирования вашего кода.
Microsoft C++ AMP (с MSVC++ 2015)
__restrict__
для указателей, которые являются членами структуры, официально не поддерживается (выделено мной):
Следующее не допускается:
- Рекурсия.
- Переменные, объявленные с ключевым словом volatile.
- Виртуальные функции.
- Указатели на функции.
- Указатели на функции-члены.
- Указатели в структурах.
- Указатели на указатели.
- Перейти к заявлениям.
- Помеченные заявления.
- пробуй, лови или бросай заявления.
- Глобальные переменные.
- Статические переменные. Вместо этого используйте ключевое слово tile_static.
- Dynamic_cast бросает.
- Оператор typeid.
- АСМ декларации.
- С переменным числом аргументов.
Microsoft Visual C++ 2015
В целом, а не код AMP C++, гораздо менее понятно, что поддерживает MSVC. Мы видим пример __restrict__
используется в union
объявление - так что это не просто изменение в параметре функции - но семантика отличается от того, что вы могли бы использовать для struct
,