【问题标题】:Accessing buffer using C++-AMP使用 C++-AMP 访问缓冲区
【发布时间】: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


【解决方案1】:

以下代码应该适用于此。您还应该检查您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2017-10-13
    • 2021-08-29
    • 2012-12-08
    相关资源
    最近更新 更多