Доступ к буферу с помощью C++-AMP

Может ли кто-нибудь помочь мне точно понять шаг, который здесь не работает?

Я пытаюсь использовать C++-AMP для выполнения параллельных циклов, однако, несмотря на отсутствие проблем или ошибок в моем процессе, я не могу получить свои окончательные данные.

Я хочу вытащить свои данные с помощью их отображения

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

Какой шаг я забыл, что позволит мне прочитать эти данные? Даже когда я пытаюсь установить тип доступа для чтения/записи процессора, я получаю сообщение об ошибке, и я даже не видел, чтобы ни одна из моих ссылок делала это таким образом:

m_Accelerator.set_default_cpu_access_type(concurrency::access_type::access_type_read_write);

Это создает ошибку, говорящую, что «ускоритель не поддерживает нулевое копирование».

Может ли кто-нибудь помочь мне и сказать, почему я не могу прочитать свой буфер и как это исправить?


person Matt    schedule 09.11.2014    source источник
comment
Я предполагаю, что m_myArray - это concurrency::array, а не array_view. Вы пробовали array_view? Затем вы можете вызвать синхронизацию(), которая сделает копию за вас.   -  person acraig5075    schedule 10.11.2014
comment
Вы пробовали запускать код в режиме релиза? На днях у меня были проблемы с графикой Intel HD, она всегда возвращала все 0 без ошибок при работе в режиме отладки.   -  person Kratz    schedule 10.11.2014


Ответы (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));

На этот вопрос есть ответ, который показывает вам, как сделать наоборот.

Чтение данных буфера с использованием C++ AMP

person Ade Miller    schedule 13.11.2014