public static extern nvrtcResult nvrtcGetPTXSize(nvrtcProgram prog, ref SizeT ptxSizeRet);
 public static extern nvrtcResult nvrtcDestroyProgram(ref nvrtcProgram prog);
 public static extern nvrtcResult nvrtcCompileProgram(nvrtcProgram prog, int numOptions, IntPtr[] options);
 public static extern nvrtcResult nvrtcCreateProgram(ref nvrtcProgram prog,
                                                     [MarshalAs(UnmanagedType.AnsiBStr)] string src,
                                                     [MarshalAs(UnmanagedType.AnsiBStr)] string name,
                                                     int numHeaders,
                                                     IntPtr[] headers,
                                                     IntPtr[] includeNames);
 public static extern nvrtcResult nvrtcGetProgramLog(nvrtcProgram prog, byte[] log);
 public static extern nvrtcResult nvrtcGetProgramLogSize(nvrtcProgram prog, ref SizeT logSizeRet);
 public static extern nvrtcResult nvrtcGetPTX(nvrtcProgram prog, byte[] ptx);
        /// <summary>
        /// Creates a runtime compiler instance.
        /// </summary>
        /// <param name="src">CUDA program source.</param>
        /// <param name="name">CUDA program name.<para/>
        /// name can be NULL; "default_program" is used when name is NULL.</param>
        /// <param name="includeNames">Sources of the headers.</param>
        /// <param name="headers">Name of each header by which they can be included in the CUDA program source.</param>
        public CudaRuntimeCompiler(string src, string name, string[] headers, string[] includeNames)
        {
            int headerCount = 0;

            IntPtr[] headersPtr      = null;
            IntPtr[] includeNamesPtr = null;

            try
            {
                if (headers != null && includeNames != null)
                {
                    if (headers.Length != includeNames.Length)
                    {
                        throw new ArgumentException("headers and includeNames must have same length.");
                    }

                    if (headers == null)
                    {
                        throw new ArgumentNullException("headers can't be NULL if includeNames is not NULL");
                    }

                    if (includeNames == null)
                    {
                        throw new ArgumentNullException("includeNames can't be NULL if headers is not NULL");
                    }

                    headerCount = headers.Length;

                    headersPtr      = new IntPtr[headerCount];
                    includeNamesPtr = new IntPtr[headerCount];

                    for (int i = 0; i < headerCount; i++)
                    {
                        headersPtr[i]      = Marshal.StringToHGlobalAnsi(headers[i]);
                        includeNamesPtr[i] = Marshal.StringToHGlobalAnsi(includeNames[i]);
                    }
                }

                _program = new nvrtcProgram();
                res      = NVRTCNativeMethods.nvrtcCreateProgram(ref _program, src, name, headerCount, headersPtr, includeNamesPtr);
                Debug.WriteLine(String.Format("{0:G}, {1}: {2}", DateTime.Now, "nvrtcCreateProgram", res));
            }
            finally
            {
                if (headersPtr != null)
                {
                    for (int i = 0; i < headersPtr.Length; i++)
                    {
                        Marshal.FreeHGlobal(headersPtr[i]);
                    }
                }

                if (includeNamesPtr != null)
                {
                    for (int i = 0; i < includeNamesPtr.Length; i++)
                    {
                        Marshal.FreeHGlobal(includeNamesPtr[i]);
                    }
                }
            }

            if (res != nvrtcResult.Success)
            {
                throw new NVRTCException(res);
            }
        }