2012-11-30 18 views
5

Poniższy kod nie kompiluje się. Komunikaty o błędach są:Domyślne parametry ograniczające (amp) funkcje

Błąd 1:

error C3930: 'foo' : no overloaded function has restriction specifiers that are compatible with the ambient context '' 

Błąd 2:

error C2660: 'f1' : function does not take 0 arguments 

Błąd 3:

IntelliSense: amp-restricted function "int foo() restrict(amp)" (declared at line 5) must be called from an amp-restricted function 

Program:

#include <amp.h> 
#include <iostream> 
using namespace std; 

int foo() restrict(amp) { return 5; } 

int f1(int x = foo()) restrict(amp) { 
    return x; 
} 

int main() 
{ 
    using namespace concurrency; 

    int a[10] = {0}; 
    array_view<int> av(10, a); 

    parallel_for_each(av.extent, [=](index<1> i) restrict(amp) { 
    av[i] = f1(); 
    }); 

    for(unsigned i=0; i<10; ++i) { 
    cout << av[i] << "\n"; 
    } 
    return 0; 
} 

Co dziwne, po usunięciu restrict(amp) na foo() i zastąpieniu połączenia f1() w lambda za pomocą, powiedzmy, 5, program kompiluje dobrze. Jakie są więc zasady wywoływania funkcji w domyślnych argumentach funkcji wzmacniacza?

+0

Napotkałem dziwne komunikaty zarówno z GCC, jak i MSVC. Okazuje się, że miałem tablicę 'MyStruct', a liczba elementów była wyłączona przez jeden:' MyStruct s_val [3] = {MyStruct (...), MyStruct (...)}; '. Żaden z kompilatorów nie powiedział mi, że licznik był wyłączony. – jww

Odpowiedz

2

MSDN Forum answer na pytanie.

Semantyka argumentów domyślnych my wybrali są zgodne z nadrzędnym założeniem C++, który analizowania programu odbywa się w jednym przejściu z lewej do prawej (pomimo kilku znaczących wyjątków od tej reguły, zwłaszcza funkcje składowe) - dlatego, że specyfikator ograniczeń jest odczytywany po deklaracji parametru funkcji, wszelkie wywołania funkcji znajdujące się w domyślnych wyrażeniach argumentów są powiązane zgodnie ze "zewnętrzną" specyfikacją ograniczeń, na lepsze lub na gorsze. Innymi słowy, czytasz program od początku z ograniczeniem cpu "aktywne" (ponieważ jest to domyślne) i przełączasz się na ograniczenie X dla wszystkiego pomiędzy "ograniczeniem (X)" i "}" zamykaniem odpowiedniego zakresu.

+0

Powinieneś chyba wyjaśnić to. Nie jest dla mnie jasne, w co się pakujesz (poza cytowaniem MSDN). – jww

Powiązane problemy