放大器限制功能中的非法外部参考

时间:2013-06-15 17:33:16

标签: c++ c++-amp

如果我正在尝试使用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 个答案:

答案 0 :(得分:1)

您可以将perm[]声明为Perlin类中的静态数组,然后将array_view<const unsigned int, 1>作为成员变量添加到类中,并在类构造函数中初始化它。然后,您可以在[this] lambda中捕获restrict(amp),并在每个函数中访问perm[]的内容。

tile_static用于告诉编译器将数据存储在哪种类型的内存中。tile_static内存是每个磁贴本地更快的内存量。如果您的C ++ AMP lambda多次读取perm array_view的每个值,那么您可以通过将数据放入tile_static内存来看到性能改进。