如何在.NET中为进程添加本地环境?

时间:2016-11-22 15:35:26

标签: .net f#

要从命令行编译Cuda内核,需要做两件事。第一种是运行vsvars批处理文件,如下所示:

"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,我一直在使用它,但它缺少一些关键功能,如lambdas,元组和访问其他Cuda库。我非常想要lambdas和元组,我甚至为Cuda编译器制作了自己的F#引用,但是这样做比在自我约束条件下运行更好。

如何在调用NVCC之前如何添加本地环境?此外,如果该过程可以重复使用会很有趣。

1 个答案:

答案 0 :(得分: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编译器。