недопустимая внешняя ссылка в ампер-ограниченной функции

Если я пытаюсь использовать усилитель 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

Решение

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

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

1

Другие решения

Других решений пока нет …