2016-11-22 31 views
1

要從命令行編譯Cuda內核,有兩件事是必需的。首先是運行vsvars批處理文件,像這樣:如何將本地環境添加到.NET中的進程?

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat" 

二是實際調用編譯器:

"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" --use-local-env --cl-version 2015 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\x64\Release" -maxrregcount=0 --machine 64 -ptx -cudart static -o "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\x64\Release\kernel.cu.obj" "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\kernel.cu" 

我想在命令行中做了以上不大,但是從F#腳本或可執行文件,但不知道如何執行第一步。其次是documented on MSDN雖然;它可以使用Process類來完成。順便說一下,Cuda庫確實具有NVCC編譯器的運行時等價物,我稱之爲NVRTC,但它缺少一些關鍵功能,例如lambda表達式,元組和對其他Cuda庫的訪問。我非常想要lambda和元組,以至於我甚至向Cuda編譯器提出了自己的F#語句,但這樣做比在自我約束下運行要好。

任何想法如何在調用NVCC之前添加該本地環境?另外,如果這個過程可以被重用,這將是有趣的。

+0

這是一個選項,你會去vcvarsx86_amd64.bat,看看它設置的變量是什麼,然後在腳本中你會聲明他們使用'processStartInfo.EnvironmentVariables.Add()'? –

+0

這可能值得一試... –

+0

呃,沒有。它可以完成,但批處理文件很長,並且有很多錯誤處理。特定於此配置,因此運行批處理文件的解決方案會更好。是否可以使用'Process'打開命令行,然後運行批處理文件和編譯器?我看到那裏有執行shell的東西...... –

回答

2
open System 
open System.Diagnostics 

let procStartInfo = 
    ProcessStartInfo(
     RedirectStandardOutput = true, 
     RedirectStandardError = true, 
     RedirectStandardInput = true, 
     UseShellExecute = false, 
     FileName = "cmd" 
    ) 

let outputHandler f (_sender:obj) (args:DataReceivedEventArgs) = f args.Data 
let p = new Process(StartInfo = procStartInfo) 
let print_to_standard_output = outputHandler <| fun x -> printfn "%s" x 
p.OutputDataReceived.AddHandler(DataReceivedEventHandler (print_to_standard_output)) 
p.ErrorDataReceived.AddHandler(DataReceivedEventHandler (print_to_standard_output)) 
p.Start() 
p.BeginOutputReadLine() 
p.BeginErrorReadLine() 
p.StandardInput.WriteLine """ "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat" """ 
p.StandardInput.WriteLine """ "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" --use-local-env --cl-version 2015 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\x64\Release" -maxrregcount=0 --machine 64 -ptx -cudart static -o "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\x64\Release\kernel.cu.obj" "C:\Users\Marko\Documents\Visual Studio 2015\Projects\Multi-armed Bandit Experiments\NVCC Experiments\kernel.cu" """ 

事實證明,可以重定向標準輸入並從程序內部控制shell。上面的代碼片段根據MSDN頁面上的代碼片段進行調整,以執行我想要的操作 - 運行批處理文件以引入環境,然後運行NVCC編譯器。

相關問題