使用CreateProcess调用nvcc.exe

时间:2013-03-18 04:17:29

标签: winapi cuda createprocess nvcc

我们目前使用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)之类的工作正常。我问了一些人,似乎:

  1. 我的应用程序已部署为32位Windows
  2. nvcc.exe位于C:/ Program Files /..../这是一个64位目录,而CreateProcess似乎无法在它没有权限的目录中调用可执行文件。
  3. PS,我们曾经使用system()来调用JIT编译器,但是system()启动了一个外部终端窗口(我们正在编写GUI),一般不推荐使用。

1 个答案:

答案 0 :(得分:1)

GetLastError()仅在发生实际错误时才有意义。您没有检查CreateProcess()的返回值,以确保实际发生错误,然后再调用GetLastError()来检索它。你需要这样做,例如:

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;

    if (!CreateProcess(cmd, args, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi))
    {
        logFF << GetLastError() << endl;
        return false;
    }

    logFF << "Running" << endl;

    WaitForSingleObject(pi.hProcess, INFINITE);

    logFF << "Terminated" << endl;

    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );

    return true;
}

据说,错误123是ERROR_INVALID_NAME(“文件名,目录名或卷标语法不正确。”)。由于您尝试调用命令行,我建议您将lpApplicationName的{​​{1}}参数设置为NULL,并单独使用CreateProcess()参数,例如:

lpCommandLine