Если я пытаюсь использовать усилитель 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"}
Вы можете объявить perm[]
как статический массив в вашем классе Perlin, а затем добавить array_view<const unsigned int, 1>
как переменную-член класса и инициализировать ее в конструкторе класса. Затем вы можете захватить [this]
в вашем restrict(amp)
лямбда и доступ к содержимому вашего perm[]
в каждой функции.
tile_static
используется для указания компилятору, в каком типе памяти хранить данные. tile_static
память — это ограниченный объем гораздо более быстрой памяти, локальной для каждой плитки. Если ваш C ++ AMP лямбда читает каждое значение perm array_view
Во многих случаях вы можете увидеть улучшение производительности, поместив данные в tile_static
объем памяти.
Других решений пока нет …