/// <summary>
        /// Simulate a memory free.
        /// </summary>
        /// <param name="hKernel">Specifies the CudaDnn kernel that holds the allocated memory.</param>
        /// <param name="nDeviceID">Specifies the CudaDnn device ID on which the memory was allocated.</param>
        /// <param name="hMemory">Specifies the CudaDnn handle to the memory.</param>
        public void FreeMemory(long hKernel, int nDeviceID, long hMemory)
        {
            string strKey   = MemoryInfo.ToKey(nDeviceID, hKernel, hMemory);
            int    nKeyHash = strKey.GetHashCode();

            if (!m_rgItems.ContainsKey(nKeyHash))
            {
                throw new Exception("Memory item '" + strKey + "' does not exist!");
            }

            m_rgItems.Remove(nKeyHash);
        }
        /// <summary>
        /// Simulate a memory allocation.
        /// </summary>
        /// <param name="hKernel">Specifies the CudaDnn kernel that holds the allocated memory.</param>
        /// <param name="nDeviceID">Specifies the CudaDnn device ID on which the memory was allocated.</param>
        /// <param name="hMemory">Specifies the CudaDnn handle to the memory.</param>
        /// <param name="lSize">Specifies the size of the memory (in items).</param>
        /// <returns></returns>
        public long AllocMemory(long hKernel, int nDeviceID, long hMemory, long lSize)
        {
            MemoryInfo mi       = new MemoryInfo(hKernel, nDeviceID, hMemory, lSize);
            string     strKey   = mi.ToKey();
            int        nKeyHash = strKey.GetHashCode();

            if (m_rgItems.ContainsKey(nKeyHash))
            {
                throw new Exception("Memory item '" + strKey + "' already exists!");
            }

            m_rgItems.Add(nKeyHash, mi);

            return(hMemory);
        }
        /// <summary>
        /// Simulate a memory free.
        /// </summary>
        /// <param name="hKernel">Specifies the CudaDnn kernel that holds the allocated memory.</param>
        /// <param name="nDeviceID">Specifies the CudaDnn device ID on which the memory was allocated.</param>
        /// <param name="hMemory">Specifies the CudaDnn handle to the memory.</param>
        public void FreeMemory(long hKernel, int nDeviceID, long hMemory)
        {
            string strKey   = MemoryInfo.ToKey(nDeviceID, hKernel, hMemory);
            int    nKeyHash = strKey.GetHashCode();

            if (!m_rgItems.ContainsKey(nKeyHash))
            {
                throw new Exception("Memory item '" + strKey + "' does not exist!");
            }

            m_rgItems.Remove(nKeyHash);

#if DEBUG
            if (m_bEnableMemoryTrace)
            {
                Trace.WriteLine("Memory Used: " + TotalMemoryUsedText);
            }
#endif
        }
        /// <summary>
        /// Simulate a memory allocation.
        /// </summary>
        /// <param name="hKernel">Specifies the CudaDnn kernel that holds the allocated memory.</param>
        /// <param name="nDeviceID">Specifies the CudaDnn device ID on which the memory was allocated.</param>
        /// <param name="hMemory">Specifies the CudaDnn handle to the memory.</param>
        /// <param name="lSize">Specifies the size of the memory (in items).</param>
        /// <param name="bHalf">Specifies whether or not half memory is used.</param>
        /// <returns></returns>
        public long AllocMemory(long hKernel, int nDeviceID, long hMemory, ulong lSize, bool bHalf)
        {
            MemoryInfo mi       = new MemoryInfo(hKernel, nDeviceID, hMemory, lSize, bHalf);
            string     strKey   = mi.ToKey();
            int        nKeyHash = strKey.GetHashCode();

            if (m_rgItems.ContainsKey(nKeyHash))
            {
                throw new Exception("Memory item '" + strKey + "' already exists!");
            }

            m_rgItems.Add(nKeyHash, mi);

#if DEBUG
            if (m_bEnableMemoryTrace)
            {
                Trace.WriteLine("Memory Used: " + TotalMemoryUsedText);
            }
#endif

            return(hMemory);
        }