有人可以帮我确切地了解不起作用的步骤吗?

我正在尝试使用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);

这会产生一个错误,说“加速器不支持零拷贝”

谁能帮助我,告诉我为什么我无法读取缓冲区,以及如何解决它?

最佳答案

下面的代码应对此起作用。您还应该检查您的DX设备和C++ AMP加速器是否与同一硬件关联。

HRESULT hr = S_OK;
array<int, 1> arr(1024);
CComPtr<ID3D11Buffer> buffer;
IUnknown* unkBuf = get_buffer(arr);
hr = unkBuf->QueryInterface(__uuidof(ID3D11Buffer), reinterpret_cast<LPVOID*>(&buffer));

这个问题的答案向您展示了相反的方法。

Reading Buffer Data using C++ AMP

关于c++ - 使用C++-AMP访问缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26830118/

10-15 17:20