Поделиться через


restrict (C++ AMP)

Спецификатор ограничения может применяться к объявлениям функций и лямбда-выражений. Он реализует ограничения на код функции и на ее поведение в приложениях, в которых используется среда выполнения C++ AMP.

Примечание

Сведения о ключевом слове restrict, входящем в состав атрибутов класса хранения __declspec, см. в разделе restrict.

Предложение restrict принимает следующие формы:

Предложение

Описание

restrict(cpu)

В функции могут использоваться все возможности языка C++. Вызывать ее могут только другие функции, объявленные с помощью функции restrict(cpu).

restrict(amp)

В функции может использоваться только то подмножество языка C++, выполнение которого может ускорить C++ AMP.

Последовательность функций restrict(cpu) и restrict(amp).

Функция должна соблюдать ограничения, устанавливаемые обеими функциями: и restrict(cpu), и restrict(amp). Вызывать ее могут функции, объявленные при помощи restrict(cpu), restrict(amp), restrict(cpu, amp) или restrict(amp, cpu).

Форма restrict(A) restrict(B) может быть записана в виде restrict(A,B).

Заметки

Ключевое слово restrict является контекстным ключевым словом. Спецификаторы ограничения cpu и amp не являются зарезервированными словами. Список спецификаторов не может быть расширен. Функция без предложения restrict аналогична функции с предложением restrict(cpu).

Для функции с предложением restrict(amp) действуют следующие ограничения:

  • Функция может вызывать только функции с предложением restrict(amp).

  • Функция должна поддерживать подстановку.

  • В функции могут объявляться только переменные типов int, unsigned int, float и double, а также классы и структуры, которые содержат только значения указанных типов. Также допускаются значения bool, однако если они используются в составном типе, то они должны иметь 4-байтное выравнивание.

  • Лямбда-функции не могут захватывать по ссылке и не могут захватывать указатели.

  • Указатели с одним косвенным обращением и ссылки поддерживаются только как локальные переменные, аргументы функций и типы возвращаемых значений.

  • Следующие возможности не допускаются:

    • Рекурсия.

    • Переменные, объявленные с ключевым словом volatile.

    • Виртуальные функции.

    • Указатели на функции.

    • Указатели на функции-члены.

    • Указатели в структурах.

    • Указатели на указатели.

    • Операторы goto.

    • Операторы с метками.

    • Операторы try, catch и throw.

    • Глобальные переменные.

    • Статические переменные. Взамен рекомендуется использовать Ключевое слово tile_static.

    • Приведение типов dynamic_cast.

    • Оператор typeid.

    • Объявления asm.

    • Использование vararg.

Сведения об ограничениях на функции см. в разделе Ограничения restrict(amp).

Пример

В следующем примере показано использование предложения restrict(amp).

void functionAmp() restrict(amp) {} 
void functionNonAmp() {} 

void callFunctions() restrict(amp) 
{ 
    // int is allowed.
    int x;
    // long long int is not allowed in an amp-restricted function. This generates a compiler error.
    // long long int y; 

    // Calling an amp-restricted function is allowed.
    functionAmp(); 

    // Calling a non-amp-restricted function is not allowed.
    // functionNonAmp(); 

}

См. также

Другие ресурсы

C++ AMP (C++ Accelerated Massive Parallelism)