Condividi tramite


restrict (C++ AMP)

L'indicatore di restrizione può essere applicato a dichiarazioni lambda e di funzione. Tale indicatore applica restrizioni sul codice della funzione e sul comportamento della funzione nelle applicazioni che utilizzano il runtime C++ AMP (Accelerated Massive Parallelism) di C++.

Nota

Per informazioni sulla restrict parola chiave che fa parte degli attributi della __declspec classe di archiviazione, vedere Restrict.

La restrict clausola accetta i formati seguenti:

Clausola Descrizione
restrict(cpu) La funzione può utilizzare il linguaggio C++ completo. Solo altre funzioni dichiarate tramite le funzioni restrict(cpu) possono chiamare la funzione.
restrict(amp) La funzione può utilizzare solo un subset del linguaggio C++ che C++ AMP può accelerare.
Sequenza di restrict(cpu) e restrict(amp). La funzione deve rispettare le limitazioni sia di restrict(cpu) che di restrict(amp). La funzione può essere chiamata dalle funzioni dichiarate tramite restrict(cpu), restrict(amp), restrict(cpu, amp) o restrict(amp, cpu).

La forma restrict(A) restrict(B) può essere scritta come restrict(A,B).

Osservazioni:

La restrict parola chiave è una parola chiave contestuale. Gli indicatori di restrizione cpu e amp non sono parole chiave riservate. L'elenco degli indicatori non è estensibile. Una funzione che non dispone di una restrict clausola è uguale a una funzione con la restrict(cpu) clausola .

Una funzione con la clausola restrict(amp) è caratterizzata dalle limitazioni seguenti:

  • La funzione può chiamare solo funzioni con la clausola restrict(amp).

  • È necessario che sia possibile rendere la funzione inline.

  • La funzione può dichiarare solo intle variabili , unsigned intfloat, e double le classi e le strutture che contengono solo questi tipi. bool è anche consentito, ma deve essere allineato a 4 byte se lo si usa in un tipo composto.

  • Le funzioni lambda non possono essere acquisite per riferimento e non possono acquisire puntatori.

  • I riferimenti e i puntatori con riferimento indiretto singolo sono supportati solo come variabili locali, argomenti di funzione e tipi restituiti.

  • Gli elementi seguenti non sono consentiti:

    • Ricorsione.

    • Variabili dichiarate con la parola chiave volatile .

    • Funzioni virtuali.

    • Puntatori a funzioni.

    • Puntatori a funzioni membro.

    • Puntatori in strutture.

    • Puntatori a puntatori.

    • Istruzionigoto .

    • Istruzioni con etichetta.

    • tryIstruzioni , catcho throw .

    • Variabili globali.

    • Variabili statiche. Usare invece tile_static Parola chiave .

    • dynamic_cast Cast.

    • Operatore typeid.

    • Dichiarazioni asm.

    • Funzioni varargs.

Per una descrizione delle limitazioni delle funzioni, vedere Limitazioni (amp) .

Esempio

Nell'esempio seguente viene illustrato come usare la restrict(amp)clausola .

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();
}

Vedi anche

C++ AMP (parallelismo massivo accelerato C++)