diff --git a/Source/CNTK/CNTK.cpp b/Source/CNTK/CNTK.cpp index 1bc14737e..258d41539 100644 --- a/Source/CNTK/CNTK.cpp +++ b/Source/CNTK/CNTK.cpp @@ -8,6 +8,10 @@ #define _CRT_NONSTDC_NO_DEPRECATE // make VS accept POSIX functions without _ #include "stdafx.h" +#ifdef _WIN32 +#include +#endif + #include "Basics.h" #include "Actions.h" #include "ComputationNetwork.h" @@ -687,7 +691,6 @@ int wmainOldCNTKConfig(int argc, wchar_t* argv[]) fprintf(stderr, "%*s%ls", i > 0 ? 2 : 0, "", argv[i]); // use 2 spaces for better visual separability fprintf(stderr, "\n\n"); -#if 1 //def _DEBUG // This simply merges all the different config parameters specified (eg, via config files or via command line directly), // and prints it. fprintf(stderr, "\n\n"); @@ -708,7 +711,6 @@ int wmainOldCNTKConfig(int argc, wchar_t* argv[]) LOGPRINTF(stderr, ">>>>>>>>>>>>>>>>>>>> PROCESSED CONFIG WITH ALL VARIABLES RESOLVED >>>>>>>>>>>>>>>>>>>>\n"); config.dumpWithResolvedVariables(); LOGPRINTF(stderr, "<<<<<<<<<<<<<<<<<<<< PROCESSED CONFIG WITH ALL VARIABLES RESOLVED <<<<<<<<<<<<<<<<<<<<\n"); -#endif LOGPRINTF(stderr, "Commands:"); for (int i = 0; i < command.size(); i++) @@ -828,15 +830,38 @@ static void LogDelayLoadError(PEXCEPTION_POINTERS pExcPointers) } } +#if _DEBUG +// in case of asserts in debug mode, print the message into stderr and throw exception +int HandleDebugAssert(int, // reportType - ignoring reportType, printing message and aborting for all reportTypes + char *message, // message - fully assembled debug user message + int * returnValue) // returnValue - retVal value of zero continues execution +{ + fprintf(stderr, "C-Runtime: %s\n", message); + + if (returnValue) { + *returnValue = 0; // return value of 0 will continue operation and NOT start the debugger + } + + return TRUE; // returning TRUE will make sure no message box is displayed +} +#endif + int wmain(int argc, wchar_t* argv[]) // wmain wrapper that reports Win32 exceptions { set_terminate(TerminateThis); // insert a termination handler to ensure stderr gets flushed before actually terminating - _set_error_mode(_OUT_TO_STDERR); // make sure there are no CRT prompts when CNTK is executing - // Note: this does not seem to work--processes with this seem to just hang instead of terminating __try { - return wmain1(argc, argv); + // in case of asserts in debug mode, print the message into stderr and throw exception + if (_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, HandleDebugAssert) == -1) { + LOGPRINTF(stderr, "CNTK: _CrtSetReportHook2 failed.\n"); + return -1; + } + + int mainReturn = wmain1(argc, argv); + _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, HandleDebugAssert); + + return mainReturn; } __except (LogDelayLoadError(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) { diff --git a/Source/Math/GPUMatrix.cu b/Source/Math/GPUMatrix.cu index ac26db042..21ee5e885 100644 --- a/Source/Math/GPUMatrix.cu +++ b/Source/Math/GPUMatrix.cu @@ -3232,7 +3232,7 @@ void GPUMatrix::BatchNormalizationForward(const GPUMatrix& s Data(), out.Data(), scale.Data(), bias.Data(), runMean.Data(), runInvStdDev.Data(), GetStream()); - assert(saveMean.IsEmpty() && saveInvStdDev.IsEmpty()); // (these are not produced in this case) + // CNTK engine returns saveMean and saveInvStdDev empty, but cnDNN engine does not. } }