【发布时间】:2014-11-09 15:59:08
【问题描述】:
有人可以帮我准确理解这里不起作用的步骤吗?
我正在尝试使用 C++-AMP 执行并行 for 循环,但是尽管在我的过程中没有遇到任何问题或错误,但我无法获得最终数据。
我想通过映射来提取我的数据
m_pDeviceContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
{
blah
}
但是我已经连续几天在这方面工作,甚至没有任何进展。
这是我使用 C++-AMP 所做的一切:
构造函数:我初始化变量是因为我必须这样做
: m_AcceleratorView(concurrency::direct3d::create_accelerator_view(reinterpret_cast<IUnknown *>(_pDevice)))
, m_myArray(_uiNumElement, m_AcceleratorView)
我将我的初始数据复制到 C++-AMP 数组中
concurrency::copy(Data.begin(), m_myArray);
我对数据做一些事情
concurrency::parallel_for_each(...) restrict(amp)
{
blah
}
这一切看起来都很好,我没有遇到任何错误。
但是我想做的下一步是从缓冲区中提取数据,这似乎不起作用:
ID3D11Buffer* pBuffer = reinterpret_cast<ID3D11Buffer *>(concurrency::direct3d::get_buffer(m_myArray));
当我映射这个数据(deviceContext->Map)时,里面的数据是0x00000000
我忘记了哪一步可以让我读取这些数据?即使我尝试设置 CPU 读/写访问类型,我也会遇到错误,而且我什至没有看到我的任何参考资料都是这样做的:
m_Accelerator.set_default_cpu_access_type(concurrency::access_type::access_type_read_write);
这会产生一个错误,说“加速器不支持零拷贝”
谁能帮助我,告诉我为什么我无法读取缓冲区,以及如何解决它?
【问题讨论】:
-
我认为
m_myArray是一个 concurrency::array 而不是 array_view。你试过array_view吗?然后,您可以调用 synchronize() 来为您完成复制。 -
你试过在发布模式下运行代码吗?前几天我的英特尔高清显卡遇到了问题,如果在调试中运行,它总是会返回全 0 且没有错误。
标签: c++ buffer directx-11 c++-amp