Проблемы в коде выхода при использовании C ++ AMP - PullRequest
0 голосов
/ 01 июня 2018

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

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

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 ()?

Вот рисунок: stack calling accelerator().default_view

1 Ответ

0 голосов
/ 03 июня 2018

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

concurrency::amp_uninitialize();

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

::GetExitCodeProcess(hChildProcess, &retVal);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...