2

在 C++Amp 中编写代码时,我遇到了一个非常奇怪的异常。我定义了两个 concurrency::array 对象,如下所示:

concurrency::array<float, 2> img_amp_data(11, 11, image_data.begin()); 
concurrency::array<float> a_amp_result(121, empty_vec.begin()); 

当我想访问第一个元素时

std::cout << img_amp_data[0][0] << std::endl; 

一切运行正常,但是当我想访问第二个时

std::cout << a_amp_result[0] << std::endl; 

我收到以下异常:

例外:(在 CPU 上无法访问该阵列)

这是一个非常奇怪的情况,因为我可以访问 2+ 维数组并且禁止仅访问一维数组?有任何想法吗?

4

1 回答 1

2

您遇到了语法怪癖。

对于arrayrank 大于 1 的,operator[]带有整数参数的返回一个array_view对原始切片的引用array。随后operator[]array_view对象进行操作,这在主机上是允许的——在您的情况下,在返回对元素的引用之前会导致隐式数据复制。

对于具有整数参数array的等级 1或带有参数的 any ,返回对元素的引用。两者都只允许在驻留的位置 - 默认情况下它是 default ,但是您也可以请求在 CPU 内存中创建 。operator[]operator[]indexarrayarrayaccelerator_viewarray

除非您想对主机和主机之间的数据移动进行细粒度控制,否则建议普遍accelerator_view使用该类型。array_view

于 2014-01-15T22:23:45.133 回答