Проблемы в коде выхода при использовании C++ AMP

Среда: Visual Studio 2017, Windows 10 вер. 1709. Режим компиляции: релиз.

Когда я звоню:

accelerator_view acc_view = accelerator().default_view;

возникает исключение (см. ссылку на рисунок ниже), но после этого код работает нормально. Но когда исполняемый процесс завершается, и я вызываю:

::GetExitCodeProcess(hChildProcess, &retVal);

из вызывающего процесса вместо возврата 0 он возвращает значение мусора в retVal. Копаясь в исходном коде, проблема, похоже, заключается в фрагменте кода ниже (SchedulerBase.cpp, строка 149).

    // Auto-reset event that is not signalled initially
    m_hThrottlingEvent = platform::__CreateAutoResetEvent();

    // Use a trampoline for UMS
    if (!RegisterWaitForSingleObject(&m_hThrottlingWait, m_hThrottlingEvent, SchedulerBase::ThrottlerTrampoline, this, INFINITE, WT_EXECUTEDEFAULT))
    {
        throw scheduler_resource_allocation_error(HRESULT_FROM_WIN32(GetLastError()));
    }

Я думаю, исправить это не в моих силах, потому что код выше находится внутри MFC. Тот же код хорошо работает при компиляции с помощью Visual Studio 2013. Обратитесь к рисунку, прикрепленному к стеку, показывающему возбужденное исключение (и перехваченное внутри), когда я вызываю

 accelerator_view acc_view = accelerator().default_view;

Вопрос: как очистить AMP перед выходом и получить правильный результат при вызове GetExitCodeProcess()?

Вот рисунок: ускоритель вызова стека().default_view


person Paulo Eduardo Pilon    schedule 01.06.2018    source источник


Ответы (1)


Решено! Если вы добавите

concurrency::amp_uninitialize();

после использования платформы AMP, когда вызывающий процесс вызывает

::GetExitCodeProcess(hChildProcess, &retVal);

Параметр retVal заполнен правильно.

person Paulo Eduardo Pilon    schedule 03.06.2018