2013-06-15 2 views
1

Если я пытаюсь использовать усилитель C++ и есть статические массивы постоянных данных, к которым должны иметь доступ ограниченные функции AMP, как я могу это легко сделать (желательно, не меняя код тоже ? много)Незаконная внешняя ссылка в функции с ограничением по ограничению

так у меня есть массив:

static unsigned char perm[512] = {151,160,137,91,90,15,...}; 

И ампер ограниченного тело, которое использует этот массив ..

float Perlin::noise(float x) restrict(amp) 
{ 
    ... 
    n0 = t0 * t0 * grad(perm[i0 & 0xff], x0); 
    // causes "illegal external reference in amp-restricted function" 
} 
+1

http://msdn.microsoft.com/en-us/library/hh388953.aspx - прямо указывает, что глобальные переменные не разрешены в ограниченных функциях. – riv

+0

Это так хромает. Значит, мне нужно было бы КОПИРОВАТЬ весь массив в _each function_, а затем создать 'array_view' для внутренней функции? – bobobobo

+0

«Нет глобальных переменных» не подразумевает никаких полей-членов для array_view? Похоже, что руководство предназначено для использования tile_static: http://msdn.microsoft.com/en-us/library/hh388954.aspx –

ответ

1

Вы можете объявить perm[], как статический массив в вашем классе Perlin, а затем добавьте array_view<const unsigned int, 1> в качестве переменной-члена в класс и инициализируйте его в конструкторе класса. Затем вы можете захватить [this] в своей лямбде restrict(amp) и получить доступ к содержимому вашего perm[] в рамках каждой функции.

tile_static используется, чтобы сообщить компилятору, какой тип памяти хранить в памяти. tile_static память - это ограниченное количество гораздо более быстрой памяти, локально для каждой плитки. Если ваш лямбда C++ AMP читает каждое значение perm array_view много раз, вы можете увидеть улучшения производительности, поместив данные в память tile_static.

Смежные вопросы