调用nvcc.exe使用的CreateProcess(Invoking nvcc.exe using

2019-10-17 20:37发布

我们目前使用的CUDA,其中nvcc.exe调用上的一些文件,并生成的结果.ptx文件模拟JIT编译器。

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的似乎并不能够调用目录中也没有权限对可执行文件。

PS,我们经常使用system()调用JIT编译器,但系统()调用外部终端窗口(我们正在写一个GUI)和一般不推荐。

Answer 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的参数CreateProcess()为NULL,并只使用lpCommandLine本身的参数,如:

bool executeWindowsProcess(ofstream &logFF)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    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 << args << endl;

    if (!CreateProcessA(NULL, 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;
}


文章来源: Invoking nvcc.exe using CreateProcess