我们目前为 CUDA 使用模拟 JIT 编译器,其中在某些文件上调用 nvcc.exe 并生成生成的 .ptx 文件。
bool executeWindowsProcess(ofstream &logFF) {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
char cmd[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\"";
char args[] = "\"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v5.0\\bin\\nvcc.exe\" --ptx --machine 32 -arch=sm_30 -o C:\\Users\\Yutong\\GOODKERNELCOMPILED.ptx --use_fast_math C:\\Users\\Yutong\\tempkernel.cu";
logFF << cmd << endl;
logFF << args << endl;
CreateProcess(cmd, args, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi);
logFF << GetLastError() << endl;
WaitForSingleObject(pi.hProcess, INFINITE);
logFF << GetLastError() << endl;
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return true;
}
第一个 GetLastError() 返回 123,这似乎表明 nvcc.exe 根本没有被调用。将 cmd[] 设置为诸如 notepad.exe(位于 C:/Windows/System32/notepad.exe 中)之类的东西可以正常工作。我问过一些人,似乎是:
- 我的应用程序是为 32 位 Windows 部署的
- nvcc.exe 位于 C:/Program Files/..../ 这是一个 64 位目录,并且 CreateProcess 似乎无法调用它没有权限的目录中的可执行文件。
PS,我们曾经使用 system() 来调用 JIT 编译器,但是 system() 会启动一个外部终端窗口(我们正在编写一个 GUI),通常不推荐使用。