Problems in exit code using C++ AMP

161 views Asked by At

Environment: Visual Studio 2017, Windows 10 ver. 1709. Compiling mode: release.

When I call:

accelerator_view acc_view = accelerator().default_view;

an exception is raised (see figure link below), but the code performs fine afterwards. But when the executable process exits and I call:

::GetExitCodeProcess(hChildProcess, &retVal);

from a caller process, instead of returning 0, it returns a garbage value in retVal. Digging the source code, the problem seems to be in the snipped code below (SchedulerBase.cpp, line 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()));
    }

I think it is beyond my hands to fix it, because the code above is inside MFC. The same code works well when compiling with Visual Studio 2013. Refer to the figure attached of the stack, showing the raised exception (and catched inside) when I call

 accelerator_view acc_view = accelerator().default_view;

The question: how to clean up the AMP before exiting and the getting the correct result when calling GetExitCodeProcess()?

Here is the figure: stack calling accelerator().default_view

1

There are 1 answers

0
Paulo Eduardo Pilon On

Solved! If you add

concurrency::amp_uninitialize();

after using AMP framework, when the caller process calls

::GetExitCodeProcess(hChildProcess, &retVal);

The retVal parameter is filled correctly.