Уважают ли 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,

Другие вопросы по тегам